diff --git a/.env b/.env index bfb90dc2..4743d40c 100644 --- a/.env +++ b/.env @@ -1,5 +1,5 @@ API_ID=1025907 API_HASH=452b0359b988148995f22ff0f4229750 -VERSION=1.4.1 -VERSION_FULL=1.4.1 (160) -BUILD=160 +VERSION=1.4.2 +VERSION_FULL=1.4.2 (161) +BUILD=161 diff --git a/CHANGELOG.md b/CHANGELOG.md index 84640895..5ca26c5a 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,3 +1,19 @@ +### 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)__. +* Replies in Forwarded Messages – reply previews are now included when **forwarding messages** to other chats, so everyone can see the full context of your inside jokes. +* From your chat list, hit the `ESC` key and instantly start typing in Search. +* Search inputs now transliterate between Latin and Cyrillic keyboards – when searching for your friend __Ivan__ you can type __Шмфт__ and the app will know what you meant. +* Along with other Telegram apps, WebK now shows `FAKE` and `SCAM` badges for suspicious chats. + +* `Monospace text` has an improved font with a cleaner look. You can also copy with a tap or click instantly. +* Using the ⬇️ button to jump to the end of a chat now has an animated transition. +* Try the reworked **Chat Backgrounds**: dark patterns now render faster and instantly resize. + +* Issues with messages marked as read automatically and deleting voice messages in Shared Media have been fixed. + +**WebK** now has an [official channel](http://t.me/WebK_en) – where we will cover important news, updates and more about the app in English (For Russian, [press 2](http://t.me/WebK_ru)). + ### 1.4.1 (144) * Supported Emoji 14. * Improved connection stability. diff --git a/CHANGELOG_ru.md b/CHANGELOG_ru.md new file mode 100644 index 00000000..9b103565 --- /dev/null +++ b/CHANGELOG_ru.md @@ -0,0 +1,15 @@ +### 1.4.2 (161) +* Видеопроигрыватель теперь поддерживает режим **«картинка в картинке»** – видео останется перед глазами, даже если Вы перейдёте в другую беседу. Для вызова режима откройте видео, далее кликните или коснитесь кнопки в правом нижнем углу проигрывателя. +* Любителей слушать музыку в Telegram порадуют два нововведения музыкального проигрывателя – **режим повтора песни** и возможность воспроизводить плейлисты в **обратном порядке**. Кроме того, проигрыватель теперь **запоминает** Ваши предпочтения __(уровень громкости, режим повтора, а также скорость воспроизведения)__. +* Сохранение ответов при пересылке – возможность быстро переместиться к исходному сообщению появилась и при **пересылке ответа** в другие чаты. Шутку не придется объяснять, если сразу добавить контекст. +* В настольных браузерах касание кнопки `ESC` откроет поиск – начинайте набор моментально. +* Не беда, если забыли переключиться с латиницы на кириллицу при поиске, WebK поймёт, что __Bdfy – это Иван__. +* Как и в остальных приложениях Telegram, метки `SCAM` и `FAKE` теперь отображаются на подозрительных чатах и каналах. + +* `Моноширинный текст` получил новый шрифт. Моментально копируйте текст с таким форматированием по клику или касанию. +* Прокрутка истории чата вниз через кнопку ⬇️ теперь анимируется. +* **Фоны для чатов** были улучшены – узоры в тёмных фонах быстрее отрисовываются и моментально перестраиваются, если Вы меняете размер окна браузера. + +* Исправлены недоработки с автоматическим прочтением сообщений и удалением голосовых заметок из вкладки Общие Медиа. + +У **WebK** появился [официальный канал](http://t.me/WebK_ru) – в нём рассказываем о приложении на русском языке (For English, [press 1](http://t.me/WebK_en)). diff --git a/public/1.1fbe64f8013ab3be0499.chunk.js b/public/1.f63fd3ceb28384c193a9.chunk.js similarity index 98% rename from public/1.1fbe64f8013ab3be0499.chunk.js rename to public/1.f63fd3ceb28384c193a9.chunk.js index be9235cf..f1592339 100644 --- a/public/1.1fbe64f8013ab3be0499.chunk.js +++ b/public/1.f63fd3ceb28384c193a9.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[1],{111: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}))},138:function(t,e,n){"use strict";var i=n(35),s=n(10),o=n(1),a=n(102);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},164: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}},56: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(111);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)}},57:function(t,e,n){"use strict";var i=n(7),s=n(75);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}},60: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(32),o=n(56),a=n(61),r=n(14),c=n(2),d=n(0),l=n(84);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)}},75:function(t,e,n){"use strict";n.d(e,"a",(function(){return d}));var i=n(33),s=n(138),o=n(14),a=n(0),r=n(113);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})}},84:function(t,e,n){"use strict";var i=n(1),s=n(2),o=n(4),a=n(37),r=n(32),c=n(164),d=n(74);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)}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.1fbe64f8013ab3be0499.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[1],{111: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}))},138:function(t,e,n){"use strict";var i=n(35),s=n(10),o=n(1),a=n(102);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},165: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}},56: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(111);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)}},57:function(t,e,n){"use strict";var i=n(7),s=n(75);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}},60: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(32),o=n(56),a=n(61),r=n(14),c=n(2),d=n(0),l=n(84);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)}},75:function(t,e,n){"use strict";n.d(e,"a",(function(){return d}));var i=n(33),s=n(138),o=n(14),a=n(0),r=n(113);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})}},84:function(t,e,n){"use strict";var i=n(1),s=n(2),o=n(4),a=n(37),r=n(32),c=n(165),d=n(74);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)}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.f63fd3ceb28384c193a9.chunk.js.map \ No newline at end of file diff --git a/public/1.1fbe64f8013ab3be0499.chunk.js.map b/public/1.f63fd3ceb28384c193a9.chunk.js.map similarity index 86% rename from public/1.1fbe64f8013ab3be0499.chunk.js.map rename to public/1.f63fd3ceb28384c193a9.chunk.js.map index 35a8651e..ada52a8d 100644 --- a/public/1.1fbe64f8013ab3be0499.chunk.js.map +++ b/public/1.f63fd3ceb28384c193a9.chunk.js.map @@ -1 +1 @@ -{"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","origin","pathname","single"],"mappings":"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","file":"1.1fbe64f8013ab3be0499.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',\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 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 +{"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","origin","pathname","single"],"mappings":"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","file":"1.f63fd3ceb28384c193a9.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 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/11.485cff055ef366a5dc5a.chunk.js b/public/11.485cff055ef366a5dc5a.chunk.js deleted file mode 100644 index e5c5d168..00000000 --- a/public/11.485cff055ef366a5dc5a.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[11],{106:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(32),n=s(64);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)}}},116: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()}}},129:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(69);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()}}},130:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(64);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})}}},151:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(117),n=s(118),a=s(2),o=s(64);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})}}},181:function(e,t,s){"use strict";s.r(t),s.d(t,"AppDialogsManager",(function(){return xc}));var i=s(63),n=s(73),a=s(0),o=s(62),r=s(70),l=s(56),c=s(32),d=s(125),h=s(175),p=s(188);const u=[...h.a].concat([...p.a]);var g=new Set(u);function m(e,t){e.setAttribute("dir","auto"),e.innerHTML=t}var b=s(61),v=s(97),f=s(80);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 L 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.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 L(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.filterMessagesByInputFilter(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),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){const s=super.setLoaded(e,t);if(s&&this.otherSideLoader&&t){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 s}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 C=s(81),M=s(79),I=s(34),E=s(59),P=s(65),k=s(58),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=Oc.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&&Oc.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;Oc.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(64);class _{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 F=s(137),j=s(84),D=s(15),R=s(83),B=s(57);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(74);class K{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{j.a.findItemByType(this.navigationType)?j.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(F.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)),j.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||j.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(66),W=s(148);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 $=(e={})=>Object(B.a)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class Q 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 Wn({}),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=$({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),Xn.removeTabFromHistory(this),Xn.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)}),Xn.removeTabFromHistory(this),Xn.selectTab(0)})});const s=new Wn({name:"Members",nameArgs:[this.peerIds.length]}),i=this.list=Oc.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}=Oc.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(27),J=s(128),Z=s(90),ee=s(60),te=s(75),se=s(28),ie=s(10),ne=s(36),ae=s(2),oe=s(69),re=s(52),le=s(1),ce=s(88),de=s(111),he=s(14),pe=s(109),ue=s(3),ge=s(40),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._volume=1,this._muted=!1,this._playbackRate=1,this._loop=!1,this._round=!1,this.playbackRates={voice:1,video:1,audio:1},this.seekBackward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.max(0,t.currentTime-(e.seekOffset||10)))},this.seekForward=e=>{const t=this.playingMedia;t&&(t.currentTime=Math.min(t.duration,t.currentTime+(e.seekOffset||10)))},this.seekTo=e=>{const t=this.playingMedia;t&&(t.currentTime=e.seekTime)},this.onMediaDocumentLoad=e=>{const t=this.mediaDetails.get(e),s=C.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.getMessageByMedia(t);if(this.playingMedia!==t){this.stop(),this.setMedia(t,o);const e=e=>e.mid===n&&e.peerId===i,s=this.listLoader.getCurrent();if(!s||!e(s)){const t=this.listLoader.getPrevious();let s,a=t.findIndex(e);-1!==a?s=-(t.length-a):(a=this.listLoader.getNext().findIndex(e),-1!==a&&(s=a+1)),-1!==a?s&&this.go(s,!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=>{e.isTrusted&&(this.onPause(e),!this.lockedSwitchers&&(this.round||!this.listLoader.current||this.listLoader.next.length)&&this.listLoader.getNext().length&&this.next()||(this.stop(),a.a.dispatchEvent("media_stop")))},this.play=()=>this.toggle(!0),this.pause=()=>this.toggle(!1),this.stop=()=>{const e=this.playingMedia;if(!e)return!1;e.paused||e.pause(),e.currentTime=0,Object(de.a)(e,"ended");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)}return this.playingMedia=void 0,this.playingMediaType=void 0,!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)=>{if(!this.lockedSwitchers)return"audio"===this.playingMediaType?this.listLoader.goRound(e,t):this.listLoader.go(e,t)},this.next=()=>this.go(1),this.previous=()=>{const e=this.playingMedia;return e&&e.currentTime>5?(e.currentTime=0,void this.toggle(!0)):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.play,pause:this.pause,stop:this.stop,seekbackward:this.seekBackward,seekforward:this.seekForward,seekto:this.seekTo,previoustrack:this.previous,nexttrack:this.next};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,loop:i,round:n}=this;return{volume:e,muted:t,playbackRate:s,loop:i,round:n}}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),C.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;return me(this,void 0,void 0,(function*(){yield Object(pe.e)(t,void 0,!1);const n=i.a.getMediaFromMessage(e),a=[],l="voice"===n.type||"round"===n.type;let c="",h="";if(null===(s=n.thumbs)||void 0===s?void 0:s.length){const s=n.thumbs[n.thumbs.length-1];if(!s.bytes){const i=ce.a.getCacheContext(n,s.type);if(i.url)a.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"});else{r.a.preloadPhoto(n,s).then(()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)})}}}else if(l){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;a.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then(s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)})}c=o.a.getPeerTitle(s,!0,!1),h=T.c.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!l){const e=n.attributes.find(e=>"documentAttributeAudio"===e._);c=e&&e.title||n.file_name,h=e&&e.performer}a.length||(ae.b?he.a?a.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):a.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}`;a.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})}));const p=new MediaMetadata({title:c,artist:h,artwork:a});navigator.mediaSession.metadata=p}))}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){return!!this.playingMedia&&(void 0===e&&(e=this.playingMedia.paused),this.playingMedia.paused===e&&(e?this.playingMedia.play():this.playingMedia.pause(),!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){this.listLoader?this.listLoader.reset():this.listLoader=new L({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 i=void 0===this.searchContext.folderId;t?this.listLoader.setTargets(t,s,i):this.listLoader.reverse=i,this.listLoader.setSearchContext(this.searchContext),this.listLoader.current=e,this.listLoader.load(!0),this.listLoader.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();return this.willBePlayed(void 0),e?this.setMedia(e,t):this.playingMedia=void 0,this.toggleSwitchers(!1),()=>{this.toggleSwitchers(!0),s&&(this.mediaDetails.get(s)?this.setMedia(s,this.getMessageByMedia(s)):this.next()||this.previous()),e&&this.playingMedia===e&&this.stop(),i&&this.play()}}toggleSwitchers(e){this.lockedSwitchers=!e}};le.a.appMediaPlaybackController=ve;var fe=ve,ye=s(121);function we(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)}}var Se=s(103);class Le{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=we(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(Se.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(Se.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(Se.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={}}}const Ce=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:""),Object(te.a)(o);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);!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 Me=(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(Ce);return s.append(...i),s};const Ie=(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 Ee=(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=Me(s,e.listenerSetter);return r.classList.add(t),Ie(o,i,e,n),o.append(r),o},Pe=s(33);class ke 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(Pe.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(Pe.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)}}var Te=s(123);function xe(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}class Ae extends Le{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)}}class Oe extends Le{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,Oe.ICONS.forEach(e=>this.icon.classList.remove("tgico-"+e)),this.icon.classList.add("tgico-"+Oe.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()}}Oe.ICONS=["volume_off","volume_mute","volume_down","volume_up"];class _e extends ke{constructor({video:e,play:t=!1,streamable:s=!1,duration:i,onPlaybackRackMenuToggle:n}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,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 Ae(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");const e=t.querySelectorAll(".toggle"),i=t.querySelector(".fullscreen"),o=t.querySelector("#time-elapsed");r=t.querySelector("#time-duration"),r.innerHTML=xe(0|s.duration);const l=new Oe(n),d=t.querySelector(".left-controls");l.btn.classList.remove("btn-icon"),d.insertBefore(l.btn,o.parentElement),Array.from(e).forEach(e=>{n.add(e)("click",()=>{this.togglePlay()})}),he.a||(n.add(s)("click",()=>{this.togglePlay()}),n.add(document)("keydown",e=>{if(a.a.overlaysActive>1)return;const{key:s,code:i}=e;let n=!0;if("KeyF"===i)this.toggleFullScreen();else if("KeyM"===i)fe.muted=!fe.muted;else if("Space"===i)this.togglePlay();else if(!e.altKey||"Equal"!==i&&"Minus"!==i)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?n=!1:"ArrowLeft"===s?fe.seekBackward({action:"seekbackward"}):fe.seekForward({action:"seekforward"});else{const e="Equal"===i?1:-1,t=fe.playbackRate,s=_e.PLAYBACK_RATES.indexOf(t)+e;s>=0&&s<_e.PLAYBACK_RATES.length&&(fe.playbackRate=_e.PLAYBACK_RATES[s])}return n?(Object(c.a)(e),!1):void 0})),n.add(s)("dblclick",()=>{he.a||this.toggleFullScreen()}),n.add(i)("click",()=>{this.toggleFullScreen()}),Object(Te.a)(t,this.onFullScreen.bind(this,i),n),n.add(s)("timeupdate",()=>{o.innerHTML=xe(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=xe(Math.round(s.duration||e)):Object(pe.e)(s).then(()=>{r.innerHTML=xe(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 \n
\n
\n
`}setBtnMenuToggle(){const e=_e.PLAYBACK_RATES.map((e,t)=>({regularText:e+"x",onClick:()=>{fe.playbackRate=e}})),t=Me(e);t.classList.add("top-left"),Ie(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;_e.PLAYBACK_RATES_ICONS.forEach(t=>{t="tgico-"+t,e.classList.remove(t)});let t=_e.PLAYBACK_RATES.indexOf(fe.playbackRate);-1===t&&(t=_e.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+_e.PLAYBACK_RATES_ICONS[t])}toggleFullScreen(){const e=this.wrapper;if(ae.c){const e=this.video;return e.webkitEnterFullscreen(),void e.enterFullscreen()}Object(Te.d)()?Object(Te.b)():Object(Te.e)(e)}onFullScreen(e){const t=Object(Te.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"))}removeListeners(){super.cleanup(),this.listenerSetter.removeAll(),this.progress.removeListeners(),this.onPlaybackRackMenuToggle=void 0}}_e.PLAYBACK_RATES=[.5,1,1.5,2],_e.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var Fe=s(134),je=s(39),De=s(96),Re=s(35);function Be(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e(()=>{i=!1,t(...s)}))}}(Re.b,e)}var Ne=s(20);function Ue(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 He=s(112);function ze(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(Se.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=Be(s);return e.addAudioListener("timeupdate",i),e.addAudioListener("ended",i),e.addAudioListener("play",()=>{Object(He.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)})},je.a),()=>{u.remove(),u=null,t=null}}}function Ve(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 Ke=(e,t)=>{let s,i;const n=!e.classList.contains("search-super-item"),a=Object(Pe.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 Ge 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=xe(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?ze(this):function(e){const t=e.withTime,s=e.message,n=i.a.getMediaFromMessage(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");if(o.classList.add("audio-description"),!a){const a=[];n.audioPerformer&&a.push(Object(De.a)(n.audioPerformer)),t?a.push(Object(ne.d)(s.date)):a.length||a.push(Ue(n.size)),e.showSender&&a.push(i.a.wrapSenderToPeer(s)),o.append(...Object(T.g)(a," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const r=e.querySelector(".audio-title"),l=new Fe.a;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.sizeType=e.dataset.sizeType,a?l.append(i.a.wrapSenderToPeer(s)):l.innerHTML=n.audioTitle||n.fileName,r.append(l),e.showSender&&r.append(i.a.wrapSentTime(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,s=new Ae(e.audio,n.supportsStreaming);e.addAudioListener("ended",()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1});const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&c.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 m=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=()=>xe(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:Ne.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?Ke(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=js({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;m(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=Ve(!1),s=Object(ie.a)();s.notifyAll({done:75,total:100}),s.catch(()=>{this.audio.pause(),fe.willBePlayed(void 0)}),s.cancel=()=>{s.cancel=je.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=Ve(),t||(this.readyPromise=Object(ie.a)());const n=()=>{i();const n=C.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",Ge);var We=s(124);class qe{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 $e(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(We.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=ic.chat.bubbles.getMiddleware();const e=ic.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=p.document)||void 0===s?void 0:s.type))u=!0,Bs({doc:p.document,div:c,lazyLoadQueue:e,group:ec,width:32,height:32,middleware:b,loadPromises:h});else{const t=p.photo||p.document;g="round"===t.type;try{js({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(We.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 Qe extends qe{constructor(e){super(e,(e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=$e({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 Ye(e,t){return e.reduce((e,t)=>e+t,t)}const Xe=0,Je=1,Ze=2,et=4,tt=8;class st{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=st.countRatios(e),this.proportions=st.countProportions(this.ratios),this.averageRatio=Ye(this.ratios,1)/this.count,this.maxSizeRatio=t/this.maxHeight}layout(){return this.count?this.count>=5||this.ratios.find(e=>e>2)?new it(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:tt|Je|Ze},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:tt|et|Ze}]}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:Je|tt|et},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:Je|Ze|et}]}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:Je|tt|et},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:Je|Ze|et}]}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:Je|tt|et},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:Je|Ze},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:et|Ze}]}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:tt|Je|Ze},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:et|tt},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:et|Ze}]}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:tt|Je|Ze},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:et|tt},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:et},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:Ze|et}]}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:Je|tt|et},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:Je|Ze},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:Ze},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:et|Ze}]}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 it{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=it.cropRatios(e,t),this.count=e.length}static cropRatios(e,t){return e.map(e=>t>1.1?Object(Se.a)(e,1,2.75):Object(Se.a)(e,.6667,1))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=Ye(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=Ye(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=$({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 rt(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 lt{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?m(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 ct=(e,t)=>rt(e.map(e=>({container:e.container,input:e.radioField.input})),t);function dt(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 ht=s(21),pt=s(44);class ut{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&&(I.c.getState().then(t=>{s.checked=Object(pt.a)(t,e.stateKey)===e.value}),s.addEventListener("change",()=>{I.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 gt=document.createElement("div");function mt(e){Object(k.a)(gt,e),document.body.append(gt),gt.dataset.timeout&&clearTimeout(+gt.dataset.timeout),gt.dataset.timeout=""+setTimeout(()=>{gt.remove(),delete gt.dataset.timeout},3e3)}function bt(e){mt(Object(T.d)(e.langPackKey,e.langPackArguments))}gt.classList.add("toast");var vt=s(89),ft=s(8);class yt extends O.b{constructor(e){super(e),this.checkUsernameDebounced=Object(vt.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=ft.a.invokeApi("channels.checkUsername",{channel:G.a.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=ft.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 wt=s(71),St=s(68);class Lt extends wt.b{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&Object(wt.a)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){const e=new bc;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&&(e.innerHTML=t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach(e=>{e.withRipple=!1;const t=new St.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 Ct=s(76);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 Wn({name:e?"ChannelType":"GroupType"}),s=Object(ht.b)(),i=new lt({radioField:new ut({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new lt({radioField:new ut({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=ct([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 Wn({}),h=new lt({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{dt(this.chatFull.exported_invite.link),mt(T.c.format("LinkCopied",!0))}}),p=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});Object(l.b)(p,()=>{new Lt("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=Object(Ct.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 Wn({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 yt({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=$({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 Wn({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),s=new St.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 It=s(82);class Et{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 Pt=s(101),kt=s(104),Tt=s(67),xt=s(99),At=s(167),Ot=s(38),_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{constructor(e){this.container=document.createElement("div"),this.list=Oc.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=Oc.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 Wn({});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(Pe.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 Wn({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(kt.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(vt.a)(this.onInput,200,!1,!0);this.input.addEventListener("input",i),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend($n()),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 _t(this,void 0,void 0,(function*(){if(this.promise)return this.promise;if(this.loadedWhat.dialogs&&this.loadedWhat.archived)return;const e=xt.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(Ot.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 _t(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(At.a)(i.concat(t))}else this.cachedContacts=i.slice();Object(V.a)(this.cachedContacts,a.a.myId),this.promise=null}const t=xt.a.height/72*1.25|0,s=this.cachedContacts.splice(0,t);this.renderResultsFunc(s),this.cachedContacts.length||(this.loadedWhat.contacts=!0)}))}getMoreChannelParticipants(){return _t(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}=Oc.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 St.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 bc;return n.classList.add("selector-user-avatar","tgico","avatar-32"),n.isDialog=!0,i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new Tt.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:Pt.a.Static})})}}var jt=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 Dt extends wt.b{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new Ft({appendTo:this.body,onChange:()=>jt(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 Rt extends z{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new Wn({name:"UserRestrictionsCanDo"}),s=document.createElement("div");s.classList.add("chatlist-container"),t.content.insertBefore(s,t.title);const i=Oc.createChatList({new:!0});s.append(i);const{dom:n}=Oc.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 Nt({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 Wn({});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(Ct.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(Ct.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 Bt=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 Nt{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 St.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=>{mt(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 Ut extends z{init(){return Bt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new Wn({name:"ChannelPermissionsHeader"});e=new Nt({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 Wn({name:"PrivacyExceptions"}),s=new lt({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new Dt({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout(()=>{i(e)},0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>Bt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void mt("User is no longer participant")}const s=new Rt(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=Oc.createChatList({new:!0});r.append(c),Object(l.b)(c,e=>{const t=Object(It.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}=Oc.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 Et({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 Ht{constructor(e,t=o.a.getDialogType(e),s){const n=new Tt.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 Tt.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 Lt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}var zt=s(100),Vt=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 Kt extends z{init(){var e;return Vt(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield zt.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 Wn({caption:G.a.isBroadcast(this.chatId)?"EnableReactionsChannelInfo":"EnableReactionsGroupInfo"}),r=new St.a({toggle:!0,checked:!!a.size}),l=new lt({checkboxField:r,titleLangKey:"EnableReactions"});o.content.append(l.container);const c=new Wn({name:"AvailableReactions"}),d=t.map(e=>{const t=new St.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 lt({checkboxField:t,title:e.title,havePadding:!0});return Us({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(vt.a)(h,3e3,!1,!0);this.eventListener.addEventListener("destroy",h,{once:!0}),this.scrollable.append(o.container,c.container)}))}}var Gt=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 Wt extends H{_init(){var e;return Gt(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 Wn({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 ot({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 lt({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 lt({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=new Kt(this.slider);e.chatId=this.chatId,e.open().then(()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)})}}),n=(yield zt.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 lt({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new Ut(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 St.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 Wn({});if(!o&&p){const t=new St.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 Wn({}),t=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:o?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});Object(l.b)(t,()=>{new Ht(h,void 0,e=>{const s=Object(Ct.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 qt=s(108);class $t 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 Wn({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 ot({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 St.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=!qt.a.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}});const l=document.createElement("div");l.classList.add("profile-name"),l.append(new Tt.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 lt({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 Tt.a({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new lt({checkboxField:r}),s=!qt.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 Wn({}),t=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});Object(l.b)(t,()=>{new Lt("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:Object(wt.a)([{langKey:"Delete",callback:()=>{const e=Object(Ct.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 Qt extends H{init(){this.container.classList.add("add-members-container"),this.nextBtn=$({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 Ft({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 Yt=!ae.d&&!1,Xt=s(127);function Jt(e){const t=document.createElement("span");return t.classList.add("badge-fake"),Object(T.b)(t,e?"ScamMessage":"FakeMessage"),t}function Zt(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(Jt(i.pFlags.scam)),s}const es=e=>e.touches?e.touches[0]:e,ts=window;let ss=!1;a.a.addEventListener("context_menu_toggle",e=>{ss=e});class is{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?ts.removeEventListener("touchmove",this.handleMove,{capture:!0}):(ts.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=es(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,he.a?ts.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):ts.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||ss)return void this.reset();this.cancelEvent&&Object(c.a)(e);const t=es(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),ts.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),ts.addEventListener("mouseup",this.reset))}removeListeners(){he.a?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),ts.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),ts.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!he.a&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var ns=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 as{constructor(e){this.scrollable=e,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(as.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=js({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(as.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(as.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(as.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(as.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(as.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(as.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(as.BASE_CLASS+"-arrow",as.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=>ns(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,uc(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(Re.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 is({element:this.avatars,onSwipe:(e,t)=>{p=e;let s=h+e*-as.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=as.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/as.SCALE))*(p>=0?1:-1);n(),this.avatars.classList.remove("no-transition"),Object(Re.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(Ot.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*as.SCALE*s;this.avatars.style.transform=as.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(as.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()}}as.BASE_CLASS="profile-avatars",as.SCALE=Yt?2:1,as.TRANSLATE_TEMPLATE=Yt?`translate3d({x}, 0, -1px) scale(${as.SCALE})`:"translate({x}, 0)";let os=(e,t)=>{t.title.innerHTML=e||"",t.container.style.display=e?"":"none"};class rs{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||ic.setPeerStatus(this.peerId,this.subtitle,e,!0,()=>t===this.peerId,!this.isDialog)},Yt||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 Wn({noDelimiter:!0}),this.avatar=new bc,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 lt({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&Promise.resolve(n.default.getProfileByPeerId(this.peerId)).then(e=>{dt(e.about),mt(T.c.format("BioCopied",!0))})}}),this.bio.title.classList.add("pre-wrap"),this.username=new lt({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{dt("@"+o.a.getPeer(this.peerId).username),mt(T.c.format("UsernameCopied",!0))}}),this.phone=new lt({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{dt("+"+E.a.getUser(this.peerId).phone),mt(T.c.format("PhoneCopied",!0))}}),this.link=new lt({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{dt(this.link.title.textContent),mt(T.c.format("LinkCopied",!0))}}),this.location=new lt({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 lt({checkboxField:new St.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=qt.a.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}}),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),Yt&&this.element.append($n()),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 as(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(Yt&&this.scrollable.container.classList.add("parallax"))}}Yt&&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);os(t,this.username)}}fillUserPhone(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=E.a.getUser(e);os(t.phone?E.a.formatUserPhone(t.phone):void 0,this.phone)}}fillNotifications(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=qt.a.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else Object(Re.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 Tt.a({peerId:e,dialog:this.isDialog}).element),this.name.append(...Zt(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(Xt.a)(n.default.getProfileByPeerId(t,e),e=>{if(this.peerId!==t||this.threadId!==s||o.a.isRestricted(t))return;if(os(e.about?X.b.wrapRichText(e.about):void 0,this.bio),!t.isUser()){const s=G.a.getChat(t.toChatId());if(s.username)os("https://t.me/"+s.username,this.link);else{const t=e.exported_invite;t&&os(t.link,this.link)}}const i=e.location;"channelLocation"==(null==i?void 0:i._)&&os(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 ls 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 rs(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(F.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 Wt(this.slider):new $t(this.slider),t&&(t instanceof Wt?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 fi({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=$({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 Tt.a({peerId:e}).element),t}),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new Tt.a({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new Tt.a({peerId:t[0]}).element],checked:!0}])}r.push(new Tt.a({peerId:e}).element),new Lt("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&&bt({langPackKey:"InviteToGroupError"})};if(s){const e=new Qt(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 Dt({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){if(n.splice(a,1),this.peerId===e){const t=this.searchSuper.tabs[i].querySelector(`div[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]--}break}}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 cs=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 ls(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=ic.selectTab(s?1:2,t);return document.body.classList.toggle("is-right-column-shown",e),n}};le.a.appSidebarRight=cs;var ds=cs;class hs 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=nt.a.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");i.innerHTML=s.poll.rQuestion;const n=s.results.results.map(e=>e.voters/s.results.total_voters*100);ms(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");c.innerHTML=X.a.wrapEmojiText(r.text);const d=document.createElement("div");d.innerText=Math.round(n[i])+"%",l.append(c,d);const h=Oc.createChatList();h.classList.add("poll-results-voters"),Oc.setListClickListener(h,()=>{ds.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,m=t.voters-4;const b=()=>{g||(g=!0,nt.a.getVotes(e,r.option,p,u).then(e=>{e.votes.forEach(e=>{const{dom:t}=Oc.addDialogNew({dialog:e.user_id.toPeerId(!1),container:h,drawStatus:!1,rippleEnabled:!1,meAsSaved:!1,avatarSize:32});t.lastMessageSpan.parentElement.remove()}),p&&(m-=e.votes.length,v.lastElementChild.replaceWith(Object(T.d)("PollResults.LoadMore",[Math.min(20,m)]))),p=e.next_offset,u=20,m&&e.votes.length||v.remove()}).finally(()=>{g=!1}))};if(b(),m<=0)return;const v=document.createElement("div");v.classList.add("poll-results-more","show-more","rp-overflow"),v.addEventListener("click",b),Object(te.a)(v);const f=document.createElement("div");f.classList.add("tgico-down"),v.append(f,Object(T.d)("PollResults.LoadMore",[Math.min(20,m)])),a.append(v)}),this.resultsDiv.append(i,a),ds.toggleSidebar(!0).then(()=>{}),t}}var ps=s(72);class us{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 bc,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 gs=0;const ms=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",()=>{vs&&bs(vs,fs,ys)}),b.b.addEventListener("resize",()=>{ws.setMaxLength(),ws.resizePolls()}),b.b.addEventListener("changeScreen",()=>{ws.setMaxLength()});const bs=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout(()=>{t(),e.remove(),vs===e&&fs===t&&ys===s&&(vs=fs=null,ys=0)},200)};let vs,fs,ys;class ws 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=xt.a.width<=360?xt.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(){gs||(gs=document.getElementById("poll-line").getTotalLength(),ws.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=nt.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
${X.a.wrapEmojiText(e.text)}
\n \n \n
\n `).join("");if(this.innerHTML=`\n
${t.rQuestion}
\n
\n
\n
\n
\n ${a}`,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-at.a.serverTimeOffset);this.quizInterval=window.setInterval(()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=xe(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(()=>{nt.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),ds.isTabExists(hs)||new hs(ds).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)=>{vs&&bs(vs,fs,ys);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),a.innerHTML=X.a.wrapRichText(e,{entities:t}),ic.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),vs=i,fs=s,ys=window.setTimeout(()=>{bs(i,s,ys)},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(Pe.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=nt.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(ps.a)(this,"",!this.isRetracted,340),Object(Re.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 us({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(Re.b)(e):e()}let n;e=e.slice(),ms(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]*ws.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*ws.MAX_OFFSET)}}ws.MAX_OFFSET=-46.5,ws.MAX_LENGTH=0,customElements.define("poll-element",ws);var Ss=s(98),Ls=s(138),Cs=s(78),Ms=s(102),Is=s(149),Es=s(150),Ps=s(45),ks=s(86),Ts=s(22),xs=s(168),As=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 Os=0;function _s({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 L,I;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=xe(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,_={};if("image/gif"===e.mime_type){const a=js({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 _.thumb=a,_.loadPromise=a.loadPromises.full,_}const F=document.createElement("video");if(F.classList.add("media-video"),F.setAttribute("playsinline","true"),F.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;Os||(Os=2*Math.PI*r),d.style.strokeDasharray=Os+" "+Os,d.style.strokeDashoffset=""+Os,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(F),t.append(i);const p=h.getContext("2d"),u=()=>{const e=i.message,t=fe.addMedia(e,!P),s=()=>{(ic.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=Os-t.currentTime/t.duration*Os;return d.style.strokeDashoffset=""+e,!t.paused},a=()=>{t.duration&&(Object(Ms.a)(t)?(t.paused&&n(),x.innerText=xe(t.duration-t.currentTime,!1)):s())},o=Be(a),r=()=>{F.classList.add("hide"),i.classList.remove("is-paused"),Object(He.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=()=>{F.classList.remove("hide"),i.classList.add("is-paused"),F.currentTime=0,x.innerText=xe(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:Ne.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?Ke(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(),F.classList.add("hide")):u():r()};s.pFlags.is_outgoing?(i.onLoad=u,i.dataset.isOutgoing="1"):u()}else F.autoplay=!0;let j;if(s){if(j=js({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}),_.thumb=j,!T&&"gif"!==e.type||g)return _.loadPromise=j.loadPromises.full,_;if(o){const e=(j.images.thumb||j.images.full).parentElement;F.width=+e.getAttributeNS(null,"width"),F.height=+e.getAttributeNS(null,"height"),e.append(F)}}else{const t=C.a.getThumb(e,!1);t&&t.promise.then(()=>{F.poster=t.cacheContext.url})}!F.parentElement&&t&&((null==j?void 0:j.aspecter)||t).append(F);const D=ce.a.getCacheContext(e),R=!!(null===(L=null==s?void 0:s.media)||void 0===L?void 0:L.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(F.addEventListener("error",e=>{4!==F.error.code&&console.error("Error "+F.error.code+"; details: "+F.error.message),O&&!R&&O.detach(),B.isFulfilled||B.resolve()},{once:!0}),Object(pe.e)(F).then(()=>{u&&M.a.addAnimation(F,u),O&&!R&&O.detach(),B.resolve()}),"video"===e.type){const e=Be(()=>{F.videoWidth&&(x.innerText=xe(F.duration-F.currentTime,!1))});F.addEventListener("timeupdate",e),A&&F.addEventListener("timeupdate",()=>{Ls.a.mutateElement(A,()=>{A.remove()})},{once:!0})}F.muted=!0,F.loop=!0,F.autoplay=!0;let N=P&&(null===(I=null==j?void 0:j.preloader)||void 0===I?void 0:I.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),F.addEventListener(ae.g?"timeupdate":"canplay",()=>{O.detach()},{once:!0})));else{const s=i=C.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(Ss.a)(F,D.url)):B.resolve()},()=>{}),{download:i,render:B}};return O&&!R&&O.setDownloadFunction(U),"gif"!==e.type||T?_.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}),_}function Fs({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 Ge;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(Is.a)(w.pop().split(" ",1)[0].toLowerCase()):"file";let L=document.createElement("div");L.classList.add("document","ext-"+S),L.dataset.docId=""+f.id;const M=document.createElement("div");M.classList.add("document-ico");const I=ce.a.getCacheContext(f);if((null===(b=f.thumbs)||void 0===b?void 0:b.length)||e.pFlags.is_outgoing&&I.url&&"photo"===f.type){L.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(f.type))M.innerHTML=``,t.push(M.firstElementChild);else{const e=js({photo:f,message:null,container:M,boxWidth:54,boxHeight:54,loadPromises:d,withoutPreloader:!0,lazyLoadQueue:p,size:r.a.choosePhotoSize(f,54,54,!0)});M.style.width=M.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 M.innerText=S;let E=f.fileName||"Unknown.file";document.createElement("div").classList.add("document-description");const P=[Ue(f.size)];t&&P.push(Object(ne.d)(e.date)),o&&P.push(i.a.wrapSenderToPeer(e)),L.innerHTML=`\n ${I.downloaded&&!y||!e.mid?"":'
'}\n
\n
\n `;const k=L.querySelector(".document-name"),x=new Fe.a;x.dataset.fontWeight=""+s,x.dataset.sizeType=u,x.innerHTML=E,k.append(x),o&&k.append(i.a.wrapSentTime(e));if(L.querySelector(".document-size").append(...Object(T.g)(P," · ")),L.prepend(M),!y&&e.pFlags.is_outgoing&&!e.mid)return L;let A,O=null;const _=()=>{if(A){A.classList.add("downloaded");const e=A;setTimeout(()=>{e.remove()},200),A=null}O&&(O=null)},F=e=>{var t;const s=!e||e.isTrusted,i=C.a.getDoc(L.dataset.docId);let n;const o=ic.chat.bubbles?ic.chat.bubbles.lazyLoadQueue.queueId:void 0;if(s)if("pdf"===i.type){const e=C.a.downloading.has(i.id)||I.downloaded;n=C.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)?C.a.downloadDoc(i,o):C.a.saveDocFile(i,o);else n=C.a.downloadDoc(i,o);return A&&(n.then(_),O.attach(A,!0,n)),{download:n}};return C.a.downloading.has(f.id)?(A=L.querySelector(".document-download"),O=new ye.a,O.attach(A,!1,C.a.downloading.get(f.id))):I.downloaded&&!y||(A=L.querySelector(".document-download"),O=e.media.preloader,O?(O.attach(A),e.media.promise.then(_)):(O=new ye.a,O.construct(),O.setManual(),O.attach(A),O.setDownloadFunction(F),void 0!==h&&h>=f.size&&Object(l.d)(O.preloader))),Object(l.b)(L,e=>{O?O.onClick(e):F(e)}),L}function js({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 L,M,I,E=s,P=!0,k=Promise.resolve();const T="document"===e._&&"image/gif"===e.mime_type&&!h;if(M=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,I=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,I,!m,!0);if(i){k=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else{js({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)),I=ce.a.getCacheContext(e,null==h?void 0:h.type);if(!v){const t=r.a.getStrippedThumbIfNeeded(e,I,!m);t&&(k=Promise.all([k,t.loadPromise]),L=t.image,L.classList.add("media-photo"),E.append(L))}M.classList.add("media-photo");const x=(L||!I.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):I.downloaded||(A=new ye.a({attachMethod:"prepend"}));const O=e=>Ds(s,M,e,x,E,L),_=()=>d&&!d()?Promise.resolve():y?Object(Es.a)(I.url,12).then(e=>O(e)):O(I.url);let F;const j=h.w>=150&&h.h>=150||S,D=()=>{S&&!p&&A&&(A.construct(),A.setManual());const t=T&&!h?C.a.downloadDoc(e,null==c?void 0:c.queueId):r.a.preloadPhoto(e,h,null==c?void 0:c.queueId,S);A&&!I.downloaded&&!p&&j&&A.attach(s,!1,t),S=void 0;const i=t.then(_);return i.catch(()=>{}),{download:t,render:i}};return A&&A.setDownloadFunction(D),I.downloaded?k=F=D().render:c?c.push({div:s,load:()=>D().download}):F=D().render,u&&k&&u.push(k),{loadPromises:{thumb:k,full:F||Promise.resolve()},images:{thumb:L,full:M},preloader:A,aspecter:E}}function Ds(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise(o=>{Object(Ss.a)(t,s,()=>{Ls.a.mutateElement(e,()=>{n.append(t),Object(Re.b)(()=>{o()}),i&&t.addEventListener("animationend",()=>{Ls.a.mutate(()=>{t.classList.remove("fade-in"),a&&a.remove()})},{once:!0})})})})}function Rs({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=Bs({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(ks.a)(e),e.addEventListener("enterFrame",t=>{t===e.maxFrame&&(e.remove(),r.remove(),ic.chat.bubbles.scrollable.container.removeEventListener("scroll",g))}),xs.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=Be(u);return ic.chat.bubbles.scrollable.container.addEventListener("scroll",g),u(),ic.emojiAnimationContainer.append(r),{animationDiv:r,stickerPromise:l}}function Bs({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:L}){var I;const E=e.sticker;if(1===E&&(L=!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"),L&&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=!L&&(2===E||3===E),A=x;let O=Object(ie.a)(),_=!1;if(((null===(I=e.thumbs)||void 0===I?void 0:I.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"),Ls.a.mutateElement(t,()=>{t.append(i),O.resolve()}))};if("url"in a)i=new Image,Object(Ss.a)(i,a.url,o),_=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.a.getPathFromPhotoPathSize(a);t.innerHTML=`\n \n `}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,Ps.a||e.pFlags.stickerThumbConverted||P.url?(Object(Ss.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o),_=!0):re.a.convert(""+e.id,a.bytes).then(n=>{a.bytes=n,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||Object(Ss.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(Ss.a)(i,P.url,o)};return P.url?(n(),Promise.resolve()):C.a.getThumbURL(e,a).promise.then(n)};if(n&&h)return n.push({div:t,load:r}),Promise.resolve();r(),a.url&&(_=!0)}}if(f&&_&&f.push(O),h)return Promise.resolve();const F=()=>As(this,void 0,void 0,(function*(){if(!s||s()){if(2===E&&!L)return yield C.a.downloadDoc(e,null==n?void 0:n.queueId).then(n=>As(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?Ls.a.mutate(()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",()=>{Ls.a.mutate(()=>{r.canvas.classList.remove("fade-in"),i()})},{once:!0})}):s&&Ls.a.mutate(i),!1!==m&&C.a.saveLottiePreview(e,r.canvas,k)},{once:!0}),p){const e={a:[],v:1};let n;Cs.a.preloadAnimatedEmojiStickerAnimation(p),Object(l.b)(t,a=>As(this,void 0,void 0,(function*(){Object(c.a)(a);const o=oe.a.getAnimation(t);if(o.paused){const e=Cs.a.getAnimatedEmojiSoundDocument(p);if(e){const s=document.createElement("audio");s.style.display="none",t.parentElement.append(s);try{yield C.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(!ic.chat.peerId.isUser())return;const r=Cs.a.getAnimatedEmojiSticker(p,!0);if(!r)return;const l=Object(Pe.a)(t,"bubble"),d=l.classList.contains("is-out"),{animationDiv:h}=Rs({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(Ts.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(Pe.a)(t,"bubble");i.a.setTyping(ic.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(L||3===E){let i;L?i=new Image:(i=document.createElement("video"),i.setAttribute("playsinline","true"),i.muted=!0,d&&(i.autoplay=!0,i.loop=!0));const l=t.firstElementChild!==i&&t.firstElementChild;return!1!==y&&(y=(y||!T||(L?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=()=>{Ls.a.mutateElement(t,()=>{if(t.append(i),l&&l.classList.add("fade-out"),3===E&&!C.a.isSavingLottiePreview(e,k)){Object(ks.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),C.a.saveLottiePreview(e,t,k)}3===E&&o&&M.a.addAnimation(i,o),a(),y&&i.addEventListener("animationend",()=>{i.classList.remove("fade-in"),l&&l.remove()},{once:!0})})};L?Object(Ss.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&&L){const s=r.a.choosePhotoSize(e,u,g,!1);t=C.a.getThumbURL(e,s).promise}else t=C.a.downloadDoc(e,null==n?void 0:n.queueId);t.then(d,a)}})}}})),j=!n||T&&!x?F():(n.push({div:t,load:F}),Promise.resolve());return T&&L&&(O=j,f&&f.push(O)),j}function Ns({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return As(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=Cs.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=document.createElement("video"),t.setAttribute("playsinline","true"),t.autoplay=!0,t.muted=!0,t.loop=!0):t=new Image,t.classList.add("media-sticker"),r.then(e=>{Object(Ss.a)(t,URL.createObjectURL(e),()=>{s.append(t)})})}}});const l=Cs.a.getStickerSet(e),c=yield l;"documentEmpty"!==c.documents[0]._&&Bs({doc:c.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function Us({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=Bs({div:n,doc:e,width:o,height:o,loadPromises:a});return a&&Promise.all(a).then(()=>{n.classList.remove("hide"),i.remove()}),r}function Hs(e,t,s){const i=new Qe("reply");return i.fill(e,t,s),i.container}function zs(e){const t=new st(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find(e=>e.sides&Ze),i=s.geometry.width+s.geometry.x,n=t.find(e=>e.sides&et),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&tt&&s&Je&&(l.style.borderTopLeftRadius="inherit"),s&tt&&s&et&&(l.style.borderBottomLeftRadius="inherit"),s&Ze&&s&Je&&(l.style.borderTopRightRadius="inherit"),s&Ze&&s&et&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}})}function Vs({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})}zs({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._?js({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:c,autoDownloadSize:d.photo}):_s({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;Os=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=Os+" "+Os,n.style.strokeDashoffset=""+Os})}}),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 Ks=s(91),Gs=s(110),Ws=s(93);function qs(e,t,s,i){return void 0===i&&(i=e.parentElement===t?Object(Ws.a)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}var $s=s(141);class Qs{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=Object(Gs.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($s.a)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)(()=>{e()&&this.onSort(s,n)})}}}var 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 Qs{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;qs(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:e=>{const{dom:t}=Oc.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:Re.b,updateListWith:e=>Ys(this,void 0,void 0,(function*(){return Object(Ms.a)(this.list)?(yield Object(Ks.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=Oc.createChatList(this.createChatListOptions);const s=()=>{t=window.setTimeout(()=>{this.updateList(e=>{e&&s()})},Xs.SORT_INTERVAL)};s()}}Xs.SORT_INTERVAL=3e4;var Js=s(164);function Zs(e){let t=!1;return new is(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!Object(Pe.a)(t.target,"progress-line")&&!Object(Js.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 ei(e){return Zs(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 ti=s(118),si=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 ii extends Dt{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>si(this,void 0,void 0,(function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}ic.setInnerPeer({peerId:s}),ic.chat.input.initMessagesForward(e)})),placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class ni{constructor(e,t,s,n){const r=new Tt.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(wt.a)(u);new Lt("popup-delete-chat",{peerId:e,titleLangKey:c,titleLangArgs:d,descriptionLangKey:h,descriptionLangArgs:p,buttons:u,checkboxes:g}).show()}}var ai=s(154);class oi{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 Lt("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var ri=s(37);function li(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var ci=s(113);const di=e=>[...e.values()].reduce((e,t)=>e+t.size,0);class hi 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(),li(),e&&(this.doNotAnimate=void 0)},Object(w.a)(this,e),this.navigationType="multiselect-"+Object(ht.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}),li();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(Pe.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(Pe.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=di(i);if(this.toggleByElement&&s){n<2&&Object(ci.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||(li(),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),li()},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 St.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&&li()),Object(ri.a)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),ae.f||(n?j.a.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):j.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(ps.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 di(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 mt(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 pi extends hi{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new R.a,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>Object(Pe.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(ps.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(ps.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 ii(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 ni(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 ui extends hi{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>Object(Pe.a)(e,"grouped-item")||Object(Pe.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(Pe.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(ps.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 oi(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 ii(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 ni(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 gi=s(146),mi=s(180),bi=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 vi{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 ii({[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 ni(this.peerId,[this.mid],"chat")};const s=e=>{let s;this.init&&(this.init(),this.init=null);try{s=Object(Pe.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=Me(this.buttons),this.element.classList.add("search-contextmenu","contextmenu"),document.getElementById("page-chats").append(this.element)}}class fi{constructor(e){this.tabs={},this.prevTabId=-1,this.lazyLoadQueue=new Z.d,this.middleware=Object(Gs.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 vi(this.container,this),this.selection=new pi(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&&ei({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(Pe.a)(e.target,"search-super-item")))},{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=Object(Pe.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(Pe.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 rc).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(Ks.a)(()=>{this.lazyLoadQueue.lock()},()=>{this.lazyLoadQueue.unlockAndRefresh()})}filterMessagesByType(e,t){if("inputMessagesFilterEmpty"===t)return e;"inputMessagesFilterUrl"!==t&&(e=e.filter(e=>!!e.media));let s=[];switch(t){case"inputMessagesFilterPhotoVideo":for(let t of e){let e=t.media.photo||t.media.document||t.media.webpage&&t.media.webpage.document;e&&("document"===e._&&"video"!==e.type||s.push(t))}break;case"inputMessagesFilterDocument":for(let t of e)t.media.document&&!["voice","audio","gif","sticker","round"].includes(t.media.document.type)&&s.push(t);break;case"inputMessagesFilterUrl":for(let t of e)s.push(t);break;case"inputMessagesFilterMusic":for(let t of e)t.media.document&&"audio"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterVoice":for(let t of e)t.media.document&&"voice"===t.media.document.type&&s.push(t);break;case"inputMessagesFilterRoundVoice":for(let t of e)t.media.document&&["voice","round"].includes(t.media.document.type)&&s.push(t)}return s}processEmptyFilter({message:e,searchGroup:t}){const{dialog:s,dom:i}=Oc.addDialogNew({dialog:e.peerId,container:t.list,drawStatus:!1,avatarSize:54});Oc.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._?_s({doc:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:c}).thumb:js({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=Fs({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,o.rDescription=X.b.wrapRichText(Object(We.a)(e.message,150,180)))}let l=document.createElement("div");if(l.classList.add("preview","row-media"),o.photo){js({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"),l.innerHTML=X.b.getAbbreviation(o.title||o.display_url||o.description||o.url,!0);let c=o.rTitle||"",d=o.rDescription||"";const h=Object(ai.a)(d),p=Object(ai.a)(X.b.wrapRichText(o.url||"")).firstElementChild;if(p instanceof HTMLAnchorElement)try{p.innerText=decodeURIComponent(p.href)}catch(e){}h.firstChild&&h.append("\n"),h.append(p),this.showSender&&h.append("\n",i.a.wrapSenderToPeer(e)),c||(c=X.b.wrapPlainText(o.display_url.split("/",1)[0]));const u=new lt({title:c,titleRight:i.a.wrapSentTime(e),subtitle:h,havePadding:!0,clickable:!0,noRipple:!0});u.container.append(l),u.container.innerText.trim().length&&n.push({element:u.container,message:e})}performSearchResult(e,t,s=!0){return bi(this,void 0,void 0,(function*(){const i=[],n=t.contentTab,a=[],o=this.middleware.get();let r,l=t.inputFilter;yield Object(Ks.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}=Oc.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(mi.a)(s)}|${Object(mi.a)(Object(Is.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(ti.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)=>I.c.getState().then(s=>{t()&&(this.searchGroups.recent.list.innerHTML="",s.recentSearch.slice(0,20).forEach(e=>{let{dialog:t,dom:s}=Oc.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=>{Oc.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=>bi(this,void 0,void 0,(function*(){this.loadMutex&&(yield this.loadMutex,!s())||(this.membersList||(this.membersList=new Xs({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),Object(l.b)(this.membersList.list,e=>{const t=Object(It.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();b.b.isMobile&&(i=ds.toggleSidebar(!1)),i.then(()=>{ic.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 bi(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*(xt.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(gi.a)(a,"desc");let d=0;for(;dc[d])break}a[n]={container:e,items:l},qs(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()}}var yi,wi=s(77),Si=s(169);!function(e){e[e.Everybody=2]="Everybody",e[e.Contacts=1]="Contacts",e[e.Nobody=0]="Nobody"}(yi||(yi={}));const Li=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 ft.a.invokeApi("account.setPrivacy",{key:{_:e},rules:t}).then(s=>(E.a.saveApiUsers(s.users),G.a.saveApiChats(s.chats),wi.a.processLocalUpdate({_:"updatePrivacy",key:{_:Object(Si.a)(e)},rules:t.map(e=>{const t={};return Object.assign(t,e),t._=Object(Si.a)(t._),t})}),s.rules))}getPrivacy(e){const t=Object(Si.a)(e),s=this.privacy[t];return s?Promise.resolve(s):this.privacy[t]=ft.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=Li;var Ci=Li;class Mi{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===yi.Everybody),this.exceptions.get("disallow").row.container.classList.toggle("hide",this.type===yi.Nobody)),this.options.onRadioChange&&this.options.onRadioChange(e)},e.captions&&e.captions.reverse(),this.radioSection=new Wn({name:e.title,caption:!0}),this.radioRows=new Map;let t=[{type:yi.Everybody,langKey:"PrivacySettingsController.Everbody"},{type:yi.Contacts,langKey:"PrivacySettingsController.MyContacts"},{type:yi.Nobody,langKey:"PrivacySettingsController.Nobody"}];e.skipTypes&&(t=t.filter(t=>!e.skipTypes.includes(t.type)));const s=Object(ht.b)();t.forEach(({type:e,langKey:t})=>{const i=new lt({radioField:new ut({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)});const i=ct([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=qn(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 lt(s),s.row.container.addEventListener("click",()=>{n.then(()=>{const t=this.peerIds[s.key];new Qt(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=Ci.getPrivacy(e.inputKey).then(t=>{const s=Ci.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 yi.Everybody:t.push({_:"inputPrivacyValueAllowAll"});break;case yi.Contacts:t.push({_:"inputPrivacyValueAllowContacts"});break;case yi.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))})}}),Ci.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 Ii extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e=document.createElement("div");e.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),dt(t.href),bt({langPackKey:"LinkCopied"})}),t}({mePath:"+380509144504"}));const t=new Mi({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[e,e,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{s.setRadio(yi.Everybody),s.radioSection.container.classList.toggle("hide",e!==yi.Nobody)}}),s=new Mi({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:["PrivacyPhoneInfo3","PrivacyPhoneInfo3",""],noExceptions:!0,skipTypes:[yi.Nobody]});this.scrollable.container.insertBefore(s.radioSection.container,t.radioSection.container.nextSibling)}}var Ei=s(92);class Pi extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new Wn({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=Cs.a.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?Bs({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(Dn,this),n.append(a),i.append(n),this.scrollable.container.append(e.container)}}var ki=s(130);function Ti(e){return!ae.f||!e}class xi 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 Wn({caption:!0,noDelimiter:!0});Object(T.b)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=Cs.a.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?Bs({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 ki.a({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),Ei.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 Pi(this.slider).open()},d=e=>{Object(Ct.a)([a.input,o,r],e)};Object(l.b)(o,e=>{d(!0),Ei.a.cancelPasswordEmail().then(e=>{this.slider.sliceTabsUntilTab(Ai,this),this.close()},()=>{d(!1)})}),Object(l.b)(r,e=>{d(!0);const t=Object(ee.f)(r);Ei.a.resendPasswordEmail().then(e=>{t.remove(),d(!1)})}),n.append(a.container,o,r),i.append(n),this.scrollable.container.append(e.container)}onOpenAfterTimeout(){Ti(this.isFirst)&&this.codeInputField.input.focus()}}class Ai 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 Wn({caption:!0,noDelimiter:!0}),t=Cs.a.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?Bs({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 Pi(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);Ei.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 xi(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 Lt("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{p(!0),Object(ee.f)(r),Ei.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(){Ti(this.isFirst)&&this.inputField.input.focus()}}var Oi=s(119),_i=s(106),Fi=s(129);class ji extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new Wn({noDelimiter:!0}),t=Cs.a.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?Bs({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 mt(T.c.format("PasswordAsHintError",!0));const i=new Ai(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 Di 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 Wn({noDelimiter:!0}),t=document.createElement("div");t.classList.add("input-wrapper");const s=this.passwordInputField=new _i.a({name:"re-enter-password",label:"PleaseReEnterPassword"}),i=new Fi.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 ji(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 Ri 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 Wn({noDelimiter:!0}),s=document.createElement("div");s.classList.add("input-wrapper");const i=this.passwordInputField=new _i.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 Oi.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 Di(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)),Ei.a.getState().then(e=>{this.state=e,this.state.hint?i.label.innerHTML=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;Ei.a.check(i.value,this.state).then(t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new Bi(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(){Ti(this.isFirst)&&this.passwordInputField.input.focus()}}class Bi extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new Wn({caption:!0,noDelimiter:!0}),t=Cs.a.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?Bs({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 Ri(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()}),Object(l.b)(s,()=>{new Lt("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{Ei.a.updateSettings({currentPassword:this.plainPassword}).then(()=>{this.slider.sliceTabsUntilTab(Dn,this),this.close()})},isDanger:!0}],titleLangKey:"TurnPasswordOffQuestionTitle",descriptionLangKey:"TurnPasswordOffQuestion"}).show()}),Object(l.b)(n,()=>{const e=new Ai(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 Ri(this.slider);t.state=this.state,t.open()})}this.scrollable.container.append(e.container)}}class Ni 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 Mi({tab:this,title:"LastSeenTitle",inputKey:"inputPrivacyKeyStatusTimestamp",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable})}}class Ui 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 Mi({tab:this,title:"PrivacyProfilePhotoTitle",inputKey:"inputPrivacyKeyProfilePhoto",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,skipTypes:[yi.Nobody]})}}class Hi 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 Mi({tab:this,title:"PrivacyForwardsTitle",inputKey:"inputPrivacyKeyForwards",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}class zi 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 Mi({tab:this,title:"WhoCanAddMe",inputKey:"inputPrivacyKeyChatInvite",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable,skipTypes:[yi.Nobody]})}}class Vi 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 Mi({tab:this,title:"WhoCanCallMe",inputKey:"inputPrivacyKeyPhoneCall",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable});{const e="PrivacySettingsController.P2p.Desc";new Mi({tab:this,title:"PrivacyP2PHeader",inputKey:"inputPrivacyKeyPhoneP2P",captions:[e,e,e],exceptionTexts:["PrivacySettingsController.NeverAllow","PrivacySettingsController.AlwaysAllow"],appendTo:this.scrollable})}}}class Ki 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 lt({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 Wn({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=Object(Ot.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 Lt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=Object(Ct.a)([e],!0);ft.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 Wn({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&&mt(T.c.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new Lt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{ft.a.invokeApi("account.resetAuthorization",{hash:e}).then(e=>{e&&n.remove()},i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=Me([{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(Pe.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(Pe.a)(e.target,"row"),n&&"0"!==n.dataset.hash&&a()})}onCloseAfterTimeout(){return this.menuElement&&this.menuElement.remove(),super.onCloseAfterTimeout()}}class Gi extends H{init(){this.header.classList.add("with-border"),this.container.classList.add("blocked-users-container"),this.setTitle("BlockedUsers");const e=new Wn({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=$({icon:"add",className:"is-visible"});this.content.append(t),Object(l.b)(t,e=>{new Dt({peerTypes:["contacts"],placeholder:"BlockModal.Search.Placeholder",onSelect:e=>{E.a.toggleBlock(e,!0)}})},{listenerSetter:this.listenerSetter});const s=Oc.createChatList();this.scrollable.container.classList.add("chatlist-container"),e.content.append(s);const i=(e,t)=>{const{dom:i}=Oc.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=Me([{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(It.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 Wi=s(132);function qi(e){return e="input"+(e=e[0].toUpperCase()+e.slice(1))}class $i extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("dont-u-dare-block-me"),this.setTitle("PrivacySettings");{const e=new Wn({noDelimiter:!0,caption:"SessionsInfo"});let t;const s=new lt({icon:"deleteuser",titleLangKey:"BlockedUsers",subtitleLangKey:"Loading",clickable:()=>{const e=new Gi(this.slider);e.peerIds=t,e.open()}});let i;s.freezed=!0;const n=new lt({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:"Loading",clickable:e=>{let t;i.pFlags.has_password?t=new Ri(this.slider):i.email_unconfirmed_pattern?(t=new xi(this.slider),t.email=i.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,Ei.a.resendPasswordEmail()):t=new Bi(this.slider),t.state=i,t.open()}});n.freezed=!0;const o=this.activeSessionsRow=new lt({icon:"activesessions",titleLangKey:"SessionsTitle",subtitleLangKey:"Loading",clickable:()=>{const e=new Ki(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(),Ei.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 Wn({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const t={},s=t.inputPrivacyKeyPhoneNumber=new lt({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:"Loading",clickable:()=>{new Ii(this.slider).open()}}),i=t.inputPrivacyKeyStatusTimestamp=new lt({titleLangKey:"LastSeenTitle",subtitleLangKey:"Loading",clickable:()=>{new Ni(this.slider).open()}}),n=t.inputPrivacyKeyProfilePhoto=new lt({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:"Loading",clickable:()=>{new Ui(this.slider).open()}}),o=t.inputPrivacyKeyPhoneCall=new lt({titleLangKey:"WhoCanCallMe",subtitleLangKey:"Loading",clickable:()=>{new Vi(this.slider).open()}}),r=t.inputPrivacyKeyForwards=new lt({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:"Loading",clickable:()=>{new Hi(this.slider).open()}}),l=t.inputPrivacyKeyChatInvite=new lt({titleLangKey:"WhoCanAddMe",subtitleLangKey:"Loading",clickable:()=>{new zi(this.slider).open()}}),c=e=>{const s=t[e];s&&Ci.getPrivacy(e).then(e=>{const t=Ci.getPrivacyRulesDetails(e),i=t.type===yi.Everybody?"PrivacySettingsController.Everbody":t.type===yi.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(qi(e.key._))})}const e=[];{const t=new Wn({name:"Privacy.SensitiveContent"});t.container.classList.add("hide"),e.push(ft.a.invokeApi("account.getContentSettings").then(e=>{if(!e.pFlags.sensitive_can_change)return;const s=e.pFlags.sensitive_enabled,i=new lt({checkboxField:new St.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&&ft.a.invokeApi("account.setContentSettings",{sensitive_enabled:e})},{once:!0})})),this.scrollable.append(t.container)}{const e=new Wn({name:"FilterChats"}),t=()=>{new Lt("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=Object(Ct.a)([s],!0);Wi.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(){ft.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 Qi(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 Ji(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 tn(e){return en(function(e){const t=e.slice(5,-1).split(", "),s=+t.pop(),i=t.map(e=>e.endsWith("%")?+e.slice(0,-1):+e);return Xi(i[0],i[1],i[2],s)}(e))}function sn(e){let{h:t,s:s,l:i}=Yi(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 nn{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=Zi(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(He.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 nn;return s.init(t),{gradientRenderer:s,canvas:t}}}class an{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(an.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=an.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(Yi(+e[1],+e[2],+e[3]),!0,!1)}),this.attachBoxListeners(),this.attachHueListeners()}attachBoxListeners(){we(this.elements.box,()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()},e=>{this.saturationHandler(e.x,e.y)},()=>{this.onGrabEnd()})}attachHueListeners(){we(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=Ji(e);return Yi(t[0],t[1],t[2],t[3])}(e);else{const t=e.match(/[.?\d]+/g);e=Yi(+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=Xi(this.hue,this.saturation,this.lightness,this.alpha),t=en(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(Se.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(Se.a)(e-this.boxRect.left,0,i)/i*100,o=Object(Se.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(Se.a)(a,0,100),c=100-l/2,d=100-Object(Se.a)(o,0,100),h=Object(Se.a)(d/100*c,0,100);this.saturation=l,this.lightness=h,s&&this.updatePicker()}}an.BASE_CLASS="color-picker";class on extends H{constructor(){super(...arguments),this._applyColor=(e,t=!0)=>{if(t)this.colorPicker.setColor(e);else{const t=Ji(e),s=this.theme.background,i=sn(t);s.id="2",s.intensity=0,s.slug="",s.color=e.toLowerCase(),s.highlightningColor=i,I.c.pushToState("settings",a.a.settings),ic.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 Wn({});this.colorPicker=new an,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new Wn({}),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(Pe.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(Ts.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 rn=0;class ln 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-"+ ++rn,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=C.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=>{ft.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=C.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=I.b.settings.themes.find(e=>e.name===this.theme.name);e&&(++this.tempId,this.theme.background=Object(ue.a)(e.background),I.c.pushToState("settings",a.a.settings),ic.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=Object(Pe.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=C.a.downloadDoc(i,ic.chat.bubbles?ic.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(Ss.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(Qi(e))})})}(i);else{const{canvas:t}=nn.create(this.getColorsFromWallpaper(e));o=Promise.resolve(Qi(t))}o.then(o=>{var r,l,c;if(!s())return void n.resolve();const d=sn(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,I.c.pushToState("settings",a.a.settings),h&&this.saveToCache(h,i),ic.applyCurrentTheme(h,i,!0).then(n.resolve)})};if(!i)return void o();const r=ce.a.getCacheContext(i);t.blur?setTimeout(()=>{Object(Es.a)(r.url,12,4).then(e=>{s()?o(e):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=qn(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 on(this.slider).open()},{listenerSetter:this.listenerSetter}),Object(l.b)(n,this.onResetClick,{listenerSetter:this.listenerSetter});const o=this.blurCheckboxField=new St.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,I.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),ft.a.invokeApiHashable({method:"account.getWallPapers"}).then(e=>{e.wallpapers.forEach(e=>{this.addWallPaper(e)})});const e=qn(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=C.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=js({photo:o,message:null,container:d,withoutPreloader:!0,size:p,noFadeIn:e.pFlags.pattern}),(h.loadPromises.thumb||h.loadPromises.full).then(()=>{Ls.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}=nn.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 cn extends wt.b{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=Object(Pe.a)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;ic.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",()=>{M.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 Cs.a.getStickerSet(this.stickerSetInput).then(e=>{if(!e)return bt({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;this.set=e.set,M.a.setOnlyOnePlayableGroup("STICKERS-POPUP"),this.h6.innerHTML=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(Ct.a)([t],!0);Cs.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;Bs({doc:t,div:e,lazyLoadQueue:s,group:"STICKERS-POPUP",play:!0,loop:!0,width:i,height:i}),this.stickersDiv.append(e)}})}}var dn,hn=s(29);function pn(e,t=!0){return function(e,t,s=!0){const i=e;let n;return s||(e=je.a),function s(){e(),n=hn.a.setTimeout(s,t())}(),e=i,()=>{clearTimeout(n)}}(e,()=>1e3*(60-(new Date).getSeconds()),t)}var un=!!(null===(dn=null===navigator||void 0===navigator?void 0:navigator.geolocation)||void 0===dn?void 0:dn.getCurrentPosition)&&!1;class gn extends H{init(){return this.header.classList.add("with-border"),this.setTitle("DoubleTapSetting"),this.container.classList.add("quick-reaction-container"),Promise.all([zt.a.getQuickReaction(),zt.a.getAvailableReactions()]).then(([e,t])=>{t=t.filter(e=>!e.pFlags.inactive);const s=new Wn,i=t.map(t=>{const s=new ut({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),i=new lt({radioField:s,havePadding:!0});return s.main.classList.add("quick-reaction-title"),Us({row:i,doc:t.static_icon,size:"small"}),t===e&&s.setValueSilently(!0),i}),n=ct(i,e=>{zt.a.setDefaultReaction(e)});s.content.append(n),this.scrollable.append(s.container)})}}class mn{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 Le({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 bn extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("general-settings-container"),this.setTitle("General");const e=qn.bind(null,this.scrollable);{const t=e("Settings"),s=new mn("TextSize",1,a.a.settings.messagesTextSize,12,20);s.onChange=e=>{I.c.setByKey("settings.messagesTextSize",e)};const i=Object(B.a)("btn-primary btn-transparent",{icon:"image",text:"ChatBackground"});Object(l.b)(i,()=>{new ln(this.slider).open()});const n=new St.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 lt({radioField:new ut({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new lt({radioField:new ut({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(un){const t=e("DistanceUnitsTitle"),s=document.createElement("form"),i="distance-unit",n="settings.distanceUnit",a=new lt({radioField:new ut({langKey:"DistanceUnitsKilometers",name:i,value:"kilometers",stateKey:n})}),o=new lt({radioField:new ut({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 lt({radioField:new ut({langKey:t,name:i,value:e,stateKey:n})})),r=pn(()=>{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 St.a({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new St.a({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const e=new Wn({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new lt({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{new gn(this.slider).open()}}),s=()=>{Promise.resolve(zt.a.getQuickReaction()).then(e=>{Us({row:t,doc:e.static_icon,size:"small"})})};s(),this.listenerSetter.add(a.a)("quick_reaction",s);const i=new St.a({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),n=new St.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 lt({title:X.b.wrapEmojiText(e.title),subtitleLangKey:"Stickers",subtitleLangArgs:[e.count],havePadding:!0,clickable:()=>{new cn({id:e.id,access_hash:e.access_hash}).show()}});o[e.id]=s;const i=document.createElement("div");i.classList.add("row-media"),Ns({set:e,container:i,group:"GENERAL-SETTINGS",lazyLoadQueue:l,width:48,height:48,autoplay:!0}),s.container.append(i),r[t](s.container)};Cs.a.getAllStickers().then(e=>{Object(ks.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 vn=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 fn extends H{init(){return vn(this,void 0,void 0,(function*(){this.container.classList.add("edit-profile-container"),this.setTitle("EditAccount.Title");const e=[];{const t=qn(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 ot({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 Wn({name:"EditAccount.Username",caption:!0}),s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new yt({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 yn=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 wn extends H{constructor(){super(...arguments),this.renderResults=e=>yn(this,void 0,void 0,(function*(){yield E.a.getContacts(),e.forEach(e=>{const{dom:t}=Oc.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");e.innerHTML=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 St.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 Wn({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 Ft({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 mt(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()}}class Sn 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 Lt("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=Ee({},"bottom-left",[e]),this.menuBtn.classList.add("hide"),this.header.append(this.confirmBtn,this.menuBtn);const t=new Wn({}),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 Wn({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 wn(this.slider).open(this.filter,"included",this)}),o.querySelector(".btn").addEventListener("click",()=>{new wn(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?mt("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)}).finally(()=>{this.confirmBtn.removeAttribute("disabled")})):mt("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=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],i=Oc.createChatList(),n=e[t].slice(),a=e=>{for(let t=0,s=Math.min(n.length,e);ta(20)),o.append(Object(T.d)("FilterShowMoreChats",[n.length])),e.append(o)}a(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.onEditOpen():this.onCreateOpen()})}}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 Cn 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 lt({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 Sn(this.slider).open(i.a.filtersStorage.getFilter(e))},{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?qs(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return Ln(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 Wn({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new Wn({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?mt("Sorry, you can't create more folders."):new Sn(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;qs(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 ft.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 mt("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 Mn 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 Wn({name:e.name}),s=new lt({checkboxField:new St.a({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new lt({checkboxField:new St.a({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=qt.a.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then(t=>{const o=()=>{const e=qt.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===qt.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,qt.a.updateNotifySettings(n,o)},{once:!0}),this.listenerSetter.add(a.a)("notify_settings",s=>{const i=qi(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 Wn({name:"NotificationsOther"}),t=new lt({checkboxField:new St.a({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new lt({checkboxField:new St.a({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});I.c.getState().then(e=>{s.checkboxField.checked=e.settings.notifications.sound}),e.content.append(t.container,s.container),this.scrollable.append(e.container),qt.a.getContactSignUpNotification().then(e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",()=>{const s=t.checkboxField.checked;e!==s&&qt.a.setContactSignUpNotification(!s)},{once:!0})})}}}var In=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 En extends H{init(){return In(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 Wn({}),t=new Map,s=ft.a.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then(s=>{const i=Object(ht.b)();s.forEach(e=>{const s=new lt({radioField:new ut({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)});const n=ct([...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 Pn(e){return new Promise((t,s)=>{const{button:i,checkbox:n}=e;i.callback=e=>{t(e?!!e.size:void 0)};const a=Object(wt.a)([i]);a.find(e=>e.isCancel).callback=()=>{s()},e.buttons=a,e.checkboxes=n&&[n],new Lt("popup-confirmation",e).show()})}function kn(e,t){const s=new Wn({name:t}),i="settings.autoDownload."+e+".",n=new St.a({text:"AutodownloadContacts",name:"contacts",stateKey:i+"contacts",withRipple:!0}),a=new St.a({text:"AutodownloadPrivateChats",name:"private",stateKey:i+"private",withRipple:!0}),o=new St.a({text:"AutodownloadGroupChats",name:"groups",stateKey:i+"groups",withRipple:!0}),r=new St.a({text:"AutodownloadChannels",name:"channels",stateKey:i+"channels",withRipple:!0});return s.content.append(n.label,a.label,o.label,r.label),s}class Tn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=kn("photo","AutoDownloadPhotosTitle");this.scrollable.append(e.container)}}class xn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=Object(vt.a)(e=>{I.c.setByKey("settings.autoDownloadNew.file_size_max",e)},200,!1,!0),t=kn("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:[Ue(s)]}),o=new mn("AutoDownloadMaxFileSize",.01,i,0,1,!1);o.onChange=t=>{const s=20447232*Math.pow(t,4)+524288|0;n.compareAndUpdate({args:[Ue(s)]}),e(s)},o.valueContainer.append(n.element),t.content.append(o.container),this.scrollable.append(t.container)}}class An extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=kn("video","AutoDownloadVideosTitle");this.scrollable.append(e.container)}}var On=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 _n={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class Fn extends z{init(){return On(this,void 0,void 0,(function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new Wn({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield I.c.getState(),s=new St.a({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,withRipple:!0}),i=()=>{Object(Ct.a)([h],Object(ge.a)(t.settings.autoDownload,I.b.settings.autoDownload)&&Object(ge.a)(t.settings.autoDownloadNew,I.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 lt({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{o(Tn)}}),c=new lt({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{o(An)}}),d=new lt({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{o(xn)}}),h=Object(B.a)("btn-primary btn-transparent primary",{icon:"delete",text:"ResetAutomaticMediaDownload"});Object(l.b)(h,()=>{Pn({titleLangKey:"ResetAutomaticMediaDownloadAlertTitle",descriptionLangKey:"ResetAutomaticMediaDownloadAlert",button:{langKey:"Reset"}}).then(()=>{a.a.settings.autoDownloadNew=Object(ue.a)(I.b.settings.autoDownloadNew),a.a.settings.autoDownload=Object(ue.a)(I.b.settings.autoDownload),I.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)}),I.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 Wn({name:"AutoplayMedia"}),t=new St.a({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),s=new St.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]?_n[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(Ue(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 Dn extends H{constructor(){super(...arguments),this.buttons={}}init(){this.container.classList.add("settings-container"),this.setTitle("Settings");const e=Ee({},"bottom-left",[{icon:"logout",text:"EditAccount.Logout",onClick:()=>{new Lt("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{ft.a.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=N("edit"),this.header.append(this.buttons.edit,e),this.profile=new rs(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",Mn],["data","DataSettings",Fn],["lock","AccountSettings.PrivacyAndSecurity",$i],["settings","Telegram.GeneralSettingsViewController",bn],["folder","AccountSettings.Filters",Cn]].map(([e,t,s])=>new lt({titleLangKey:t,icon:e,clickable:()=>{new s(this.slider,!0).open()}}));o.push(this.devicesRow=new lt({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>jn(this,void 0,void 0,(function*(){this.authorizations||(yield this.updateActiveSessions());const e=new Ki(this.slider);e.authorizations=this.authorizations,e.eventListener.addEventListener("destroy",()=>{this.authorizations=void 0,this.updateActiveSessions(!0)},{once:!0}),e.open()}))}),this.languageRow=new lt({titleLangKey:"AccountSettings.Language",titleRightSecondary:Object(T.d)("LanguageName"),icon:"language",clickable:()=>{new En(this.slider).open()}})),i.append(...o.map(e=>e.container));const r=new Wn;r.content.append(i),this.scrollable.append(this.profile.element,r.container),this.buttons.edit.addEventListener("click",()=>{new fn(this.slider).open()}),oe.a.loadLottieWorkers(),this.updateActiveSessions()}getAuthorizations(e){if(this.getAuthorizationsPromise&&!e)return this.getAuthorizationsPromise;const t=this.getAuthorizationsPromise=ft.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 Rn 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 Wn({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=$({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)}),Xn.removeTabFromHistory(this),new Qt(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 Bn=s(151);class Nn extends wt.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&&(bt({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 Bn.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(ti.a)(o.phone);r.code&&(n.value="+"+r.code.country_code);const c=new ot({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 Un extends H{init(){this.container.id="contacts-container";const e=$({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,()=>{new Nn},{listenerSetter:this.listenerSetter}),this.inputSearch=new _("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(Gs.a)()}createList(){const e=new Xs,t=e.list;return t.id="contacts",t.classList.add("contacts-container"),Oc.setListClickListener(t,()=>{this.close()},void 0,!0),e}onClose(){this.middleware.clean()}onOpenAfterTimeout(){!ae.e&&Ti(!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=xt.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 Hn extends H{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!Oc.sortedLists[Hn.filterId]){const e=Oc.createChatList();Oc.generateScrollable(e,Hn.filterId).container.append(e),Oc.setListClickListener(e,null,!0)}const e=Oc.scrollables[Hn.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=Oc.filterId,Oc.setFilterId(Hn.filterId),Oc.onTabChange()}onOpenAfterTimeout(){Oc.sortedLists[this.wasFilterId].clear()}onClose(){Oc.setFilterId(this.wasFilterId),Oc.onTabChange()}onCloseAfterTimeout(){return Oc.sortedLists[Hn.filterId].clear(),super.onCloseAfterTimeout()}}Hn.filterId=1;class zn 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=$({icon:"check"});const e=Cs.a.getAnimatedEmojiSticker("🧭"),t=document.createElement("div");t.classList.add("sticker-container"),e?Bs({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 Xs({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 Oc.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,()=>{Pn({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 Q(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,mt("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,mt("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 Vn=s(5),Kn=s(6);function Gn(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 Wn{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($n()),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 qn=(e,t,s)=>{const i=new Wn({name:t,caption:s});return e.append(i.container),i.content},$n=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e};class Qn extends Wn{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 Yn=new class extends K{constructor(){super({sidebarEl:document.getElementById("column-left"),navigationType:"left"}),this.searchGroups={},this.inputSearch=new _("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new Un(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new Hn(this).open()},verify:()=>!!i.a.dialogsStorage.getFolderDialogs(1,!1).length||!i.a.dialogsStorage.isDialogsLoaded(1)},n=new St.a({toggle:!0,checked:"night"===a.a.getTheme().name});n.input.addEventListener("change",()=>{a.a.settings.theme=n.input.checked?"night":"day",I.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(()=>{ic.setPeer({peerId:ic.myId})},0)}},s,{icon:"user",text:"Contacts",onClick:t},un?{icon:"group",text:"PeopleNearby",onClick:()=>{new zn(this).open()}}:void 0,{icon:"settings",text:"Settings",onClick:()=>{new Dn(this).open()}},{icon:"darkmode",text:"DarkMode",onClick:()=>{},checkboxField:n},{icon:"animations",text:"Animations",onClick:()=>{},checkboxField:new St.a({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=T.c.format("TelegramFeaturesUrl",!0);ic.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([Kn.a.set({kz_version:"Z"}),Kn.a.delete("tgme_sync")]).then(()=>{location.href="https://web.telegram.org/z/"})},verify:()=>Vn.a.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Kn.a.delete("tgme_sync").then(()=>{location.href="https://web.telegram.org/?legacy=1"})},verify:()=>Vn.a.isMainDomain}].filter(Boolean);this.toolsBtn=Ee({},"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"+Vn.a.suffix+" "+Vn.a.versionFull,c.append(d),r.classList.add("has-footer"),r.append(c),this.newBtnMenu=Ee({},"top-left",[{icon:"newchannel",text:"NewChannel",onClick:()=>{new Rn(this).open()}},{icon:"newgroup",text:"NewGroup",onClick:()=>{new Qt(this).open({type:"chat",skippable:!1,takeOut:e=>{new Q(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=""+Gn(t,1),this.archivedCount.classList.toggle("hide",!t)}}),E.a.getTopPeers("correspondents"),I.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!==Vn.a.versionFull&&(this.hasUpdate=!0,clearInterval(s),this.newBtnMenu.classList.contains("is-hidden")||this.updateBtn.classList.remove("is-hidden"))}).catch(je.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 fi({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(Pe.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 bc;return i.classList.add("selector-user-avatar","tgico","avatar-30"),i.isDialog=!0,s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new Tt.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(It.a)(e.target,"LI");if(!t)return;const s=Object(Pe.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();I.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),I.c.pushToState("recentSearch",t);for(const e of t)I.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(F.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||j.a.findItemByType("global-search")||j.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),j.a.removeByType("global-search"),b(0)});const f=N("close");this.searchGroups.recent.nameEl.append(f),f.addEventListener("click",()=>{Pn({descriptionLangKey:"Search.Confirm.ClearHistory",button:{langKey:"ClearButton",isDanger:!0}}).then(()=>{I.c.getState().then(e=>{this.searchGroups.recent.clear();const t=e.recentSearch||[];for(const e of t)I.c.releaseSinglePeer(e,"recentSearch");t.length=0,I.c.pushToState("recentSearch",t)})})})}};le.a.appSidebarLeft=Yn;var Xn=Yn;class Jn{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(Ot.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 Zn extends wt.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 ta 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=zt.a.getReaction(s.reaction);Object(Xt.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=Bs({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=Gn(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 us({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(ps.a)(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){Object(Xt.a)(zt.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([Bs({div:s,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1}),Rs({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1}).stickerPromise]).then(([e,t])=>{const i=()=>{Object(Re.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",ta);const sa=new Map;class ia extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[]}connectedCallback(){let e=sa.get(this.key);e||sa.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=sa.get(this.key);e.delete(this),e.size||sa.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=zt.a.getAvailableReactions(),n=s?i instanceof Promise?t.results:t.results.filter(e=>zt.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 ta,n.init(this.type)),qs(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",ia);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 na 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 us({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)?Gn(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",na);const aa=()=>{const e=document.createElement("i");return e.classList.add("edited"),Object(T.b)(e,"EditedMessage"),e},oa=()=>Object(T.d)("SponsoredMessage");var ra,la;(la=ra||(ra={})).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=Gn(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");t.innerHTML=X.b.wrapEmojiText(e)+", ",o.push(t)}}if(n.edit_date&&"scheduled"!==s&&!n.pFlags.edit_hide&&o.unshift(r=aa()),"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 ia,c.init(d,"inline",!0),c.render(),o.unshift(c))}else h&&o.push(l=oa());g&&o.push(g);let m=h?void 0:Object(ne.g)(a);p&&(m+=(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 b=document.createElement("span");b.classList.add("time","tgico"),b.append(...o);const v=document.createElement("div");v.classList.add("inner","tgico"),m&&(v.title=m);let f=o;if(r&&(f[f.indexOf(r)]=aa()),l&&(f[f.indexOf(l)]=oa()),c){const e=f[f.indexOf(c)]=new ia;e.init(d,"inline"),e.render()}return f=f.map(e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e),g&&(f[f.length-1]=Object(ne.f)(a)),v.append(...f),b.append(v),b},la.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 na;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},la.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 Tt.a({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const c=Hs(r,void 0,l);a?a.replaceWith(c):s.append(c),t.classList.add("is-reply")};var ca=s(147);function da(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 ha(e){e.style.display="none",e.offsetLeft,e.style.display=""}le.a.getElementByPoint=da;var pa=s(16),ua=s(19),ga=s(48),ma=s(131),ba=s(11);const va={keywords:{},version:0,langCode:Vn.a.langPackCode};class fa{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=Vn.a.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=ba.a.get(s).then(t=>(Object(ua.a)(t)||(t={}),Object(ga.a)(va,t),t.langCode=e,this.keywordLangPacks[e]=t,ft.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!==Vn.a.langPackCode&&e.push(this.getEmojiKeywords(T.c.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new ma.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(fa.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=I.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),I.c.pushToState("recentEmoji",t),a.a.dispatchEvent("emoji_recent",e)})}}fa.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const ya=new fa;le.a&&(le.a.appEmojiManager=ya);var wa=ya,Sa=s(23),La=s(26);const Ca=new Set;function Ma(e,t,s=!1,i=!1){var n;const o=document.createElement("span");let r;if(o.classList.add("super-emoji"),i&&!Sa.a?r=X.a.wrapSingleEmoji(e):(e=X.a.fixEmoji(e),r=X.a.wrapEmojiText(e)),o.innerHTML=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(!Ca.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(Re.b)(()=>{a.a.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),o.classList.remove("empty"),Ca.add(t)})},{once:!0}),o.append(s)}}s?t.prepend(o):t.appendChild(o)}function Ia(e){return Object(Pe.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 Ea{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{Object(c.a)(e);const t=Ia(e.target);t&&(ic.chat.input.onEmojiSelected(t,!1),he.b&&Object(ri.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 La.b){const i=""+La.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=>{Ma(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(pa.a)(200),wa.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=Ka.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)Ma(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 Pa=s(136),ka=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 Ta{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(()=>ka(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(Re.a)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t){t.remove(),t.src="",t.load();M.a.getAnimations(t).forEach(e=>{M.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=C.a.getDoc(t);return this.scrollPromise.then(()=>{const t=_s({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();M.a.getAnimations(t).forEach(e=>{M.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(Pa.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=C.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(Ss.a)(c,l.cacheContext.url,d):d()}}class xa{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",Ka.onMediaClick);const t=new P.b(this.content,"GIFS"),s=new Ta(e,Va,t),i=Object(ee.f)(this.content,!0);ft.a.invokeApi("messages.getSavedGifs",{hash:"0"}).then(e=>{"messages.savedGifs"===e._&&e.gifs.forEach((t,i)=>{e.gifs[i]=t=C.a.saveDoc(t),s.add(t)}),i.remove()}),Wa.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}var Aa=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 Oa{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{M.a.getAnimations(e).forEach(e=>{t?M.a.checkAnimation(e,!1):M.a.checkAnimation(e,!0,!0)})},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=C.a.getDoc(t),i=b.b.active.esgSticker.width,n=Bs({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=C.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)),Bs({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 _a{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&&(a.innerHTML=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 Aa(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=Cs.a.getStickerSet(e);this.categoryPush(s,X.a.wrapEmojiText(e.title),n.then(e=>e.documents),t);yield n;Ns({set:e,container:i,group:Va,lazyLoadQueue:Ka.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(Pe.a)(t,"category-title")){const e=Object(kt.a)(t,"data-id");new cn({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else Ka.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()},Wa.addEventListener("closed",()=>{s(!0)}),Wa.addEventListener("opened",()=>{s()}),this.stickyIntersector=Ka.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=Object(ee.f)(this.content,!0);Promise.all([Cs.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"))}),Cs.a.getAllStickers().then(e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)})]).finally(()=>{this.mounted=!0,s()}),this.superStickerRenderer=new Oa(Ka.lazyLoadQueue,Va),Wa.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(Cs.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 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())}))};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 ft.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=C.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($s.a)(t,n,"rating"),I.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 Fa(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}),Wi.a.setDraft(e,t,"@"+E.a.getUser(s).username+" "+i)}callbackButtonClick(e,t,s){return ft.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&&mt(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?C.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 Da=ja,Ra=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 Ba extends H{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=Object(Pe.a)(e.target,"gif");if(!t)return;const s=t.dataset.docId;ic.chat.input.sendMessageWithDocument(s)?b.b.isMobile&&ds.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new _("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 Ta(this.gifsDiv,"GIFS-SEARCH",this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",M.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 ds.toggleSidebar(!0).then(()=>{this.search("",!0),this.scrollable.onScrolledBottom=()=>{this.search(this.inputSearch.value,!1)}}),e}search(e,t=!0){return Ra(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=Da.getInlineResults(Ne.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 Na extends H{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new Z.d,this.inputSearch=new _("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(Pe.a)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void ic.chat.input.sendMessageWithDocument(e)}const s=Object(Pe.a)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=Object(Pe.a)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),Cs.a.getStickerSet({id:i,access_hash:n}).then(e=>{Cs.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")})})):Cs.a.getStickerSet({id:i,access_hash:n}).then(e=>{new cn(e.set).show()})},{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",M.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=`\n
${X.a.wrapEmojiText(e.title)}
\n `;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 Cs.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()}),M.a.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?Cs.a.searchStickerSets(e,!1).then(t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach(e=>{this.renderSet(e.set)})}):this.renderFeatured()}}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())}))};class Ha 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(ci.a)(t,this.element)||(this.displayTimeout=window.setTimeout(()=>{this.toggle(!1)},200))},this.toggle=e=>Ua(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 za=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 Va="emoticons-dropdown";class Ka extends Ha{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(M.a.checkAnimations(!0,Va),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}=ic.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(Ws.a)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",()=>za(this,void 0,void 0,(function*(){he.a&&Object(ri.a)()&&(yield Object(pa.a)(100)),this.element.parentElement!==ic.chat.input.chatInput&&ic.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),Ka.lazyLoadQueue.lock(),M.a.lockIntersectionGroup(Va)}))),this.addEventListener("opened",()=>{M.a.unlockIntersectionGroup(Va),Ka.lazyLoadQueue.unlock(),Ka.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")}),this.addEventListener("close",()=>{Ka.lazyLoadQueue.lock(),M.a.lockIntersectionGroup(Va),M.a.checkAnimations(!0,Va)}),this.addEventListener("closed",()=>{M.a.unlockIntersectionGroup(Va),Ka.lazyLoadQueue.unlock(),Ka.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0})}init(){this.emojiTab=new Ea,this.stickersTab=new _a,this.gifsTab=new xa,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(),M.a.checkAnimations(!1,Va)}),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",()=>{1===this.tabId?ds.isTabExists(Na)||new Na(ds).open():ds.isTabExists(Ba)||new Ba(ds).open()}),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",e=>{var t;const s=ic.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});ic.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===ic.chat.input.messageInput)return e.getRangeAt(0)}}Ka.lazyLoadQueue=new Z.d,Ka.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 ea(t.container,(i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=Object(Ws.a)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=Object(Pe.a)(s,"menu-horizontal-div-item"),!s)return;const i=Object(Ws.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}},Ka.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=Object(It.a)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(ic.chat.input.sendMessageWithDocument(i,void 0,t)?(Ga.container&&(Ga.forceClose=!0,Ga.container.classList.add("disable-hover"),Ga.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const Ga=new Ka;le.a.emoticonsDropdown=Ga;var Wa=Ga;var qa=s(187);var $a=!("undefined"==typeof RTCPeerConnection||ae.d);var Qa=$a;function Ya(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{ft.a.invokeApi("messages.importChatInvite",{hash:e}).then(e=>{wi.a.processUpdateMessage(e);const t=e.chats[0].id.toPeerId(!0);a.a.dispatchEvent("history_focus",{peerId:t})},e=>{"INVITE_REQUEST_SENT"===e.type&&bt({langPackKey:"RequestToJoinSent"})})}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new bc;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===t.photo._?(t.photo=r.a.savePhoto(t.photo),js({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):d.a.putPhoto(s,Ne.c,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),i.innerHTML=X.b.wrapEmojiText(t.title);const n=t.pFlags.broadcast,o=Object(T.d)(n?"Subscribers":"Members",[Object(Ja.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"}(Xa||(Xa={}));class eo{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&&ha(t)}}class to{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(Pe.a)(e.target,"bubble-content");if(t&&!this.chat.selection.isSelecting){const e=Object(Pe.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(pa.a)(400)]).then(([e])=>{const t=e[0];t?Bs({div:s,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:ec,withThumb:!1,needFadeIn:!1}).then(e=>{Object(ks.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(Pe.a)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&Object(Pe.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 Zn(new Date(+e),this.onDatePick).show();break}}return}if(!he.a&&Object(Pe.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(Pe.a)(s,"grouped-item")||i)}const n=Object(Pe.a)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer({peerId:n.dataset.peerId.toPeerId()});const a=Object(Pe.a)(s,"bubble-call");if(a)return void this.chat.appImManager.callUser(this.peerId.toUserId(),a.dataset.type);const o=Object(Pe.a)(s,"spoiler");if(o){const t=Object(Pe.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(ps.a)(t,s,!0,n,()=>{t.dataset.spoilerTimeout=""+window.setTimeout(()=>{Object(ps.a)(t,s,!1,n,()=>{t.classList.remove("will-change"),delete t.dataset.spoilerTimeout})},a)},r)}const r=Object(It.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(Pe.a)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===Ne.d){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(Pe.a)(s,"is-via");if(d){const t=d.querySelector(".peer-title");if(s===t||Object(ci.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(Pe.a)(s,"peer-title")||Object(It.a)(s,"AVATAR-ELEMENT")||Object(kt.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!==Ne.c?this.chat.appImManager.setInnerPeer({peerId:t}):mt(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 cn(s.stickerSetInput).show())}const p=Object(Pe.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")){const t=Object(Pe.a)(s,"album-item")||Object(Pe.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=>rc.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(Pe.a)(s,"media-container-aspecter"))return;let n=Object(Pe.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 rc).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(It.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 ii({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!Object(Pe.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 Jn(this.chat),this.preloader=new ye.a({cancelable:!1}),this.lazyLoadQueue=new Z.d,this.lazyLoadQueue.queueId=++oo,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+at.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(Pe.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(Ks.c)().then(()=>{const s=t.querySelector(".time"),i=Fs({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 Ge||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(Ks.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(Re.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 eo(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 eo(this.scrollable,!0),t.save());const e=s.peerId+"_"+s.mid,n=sa.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(gi.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(Ks.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,ra.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;Zs({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.chat.canSend())&&(i=Object(Pe.a)(t.target,"bubble"),i&&(Object(ps.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(ps.a)(t,e,!1,250,()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())}),Object(Re.b)(()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}})},listenerOptions:{capture:!0}})}let m;Object(l.b)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),le.b&&this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{const t=Object(Pe.a)(e.target,"grouped-item")||Object(Pe.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 ea(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(vt.a)(this.sliceViewport.bind(this),3e3,!1,!0)),Object(Ks.a)(()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),m=this.getMiddleware()},()=>{this.isHeavyAnimationInProgress=!1,m&&m()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),m=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(Ks.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(gi.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(Re.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=Gn(i,1);let s=!1;a.forEach(i=>{(s||i.innerHTML!==e)&&(t||(t=new eo(this.scrollable,!0),t.save()),s=!0,i.innerHTML=e)})}}t&&t.restore()})}),this.observer=new to({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(vt.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(ps.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=xt.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=da(this.scrollable.container,e,"center");return t&&(t=Object(Pe.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(gi.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),M.a.checkAnimations(!1,ec),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(Pe.a)(e,"bubble");let a;if(n&&"end"!==t&&Object(Ws.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=xt.a.height;return t-=this.bubblesContainer.offsetTop,t-=b.b.isMobile||xt.a.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{this.onScroll(!0,e)}});return s===Pt.a.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),r}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return so(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 so(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(gi.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=r&&(u||n)||l,w=b>0&&(bthis.performHistoryResult(d.mids,!0,!1,void 0)),cached:!0}:this.getHistory(t,!0,u,m);const{promise:I,cached:E}=C;E||n||(g.container.textContent="",this.chat.finishPeerChange(l,u,t,s),this.preloader.attach(this.bubblesContainer));const P=this.getMiddleware();M.a.lockGroup(ec);const T=I.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),M.a.unlockGroup(ec),M.a.checkAnimations(!1,ec),this.lazyLoadQueue.unlock(),d)g.setScrollTopSilently(d.top);else if(y){let e;if(S)g.setScrollTopSilently(99999);else if(L){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),g.setScrollTopSilently(0)}const s=this.getMountedBubble(t);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:Pt.a.Static),!c&&l&&this.highlightBubble(a)}e&&(i||Promise.resolve()).then(()=>{e()})}else g.setScrollTopSilently(99999);this.onScroll();const i=this.getMiddleware(),o=Promise.all([T,Object(Ks.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(Ks.c)(),Object(pa.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(ca.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(" "),L=i.lastElementChild,L.classList.contains("bubble-content-wrapper")||(L=i.querySelector(".bubble-content-wrapper")),S=L.firstElementChild,S.innerHTML="",S.style.cssText="",L.innerHTML="",L.appendChild(S);const a=L.style.transitionDelay;L.style.cssText="",L.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(L=document.createElement("div"),L.classList.add("bubble-content-wrapper"),S=document.createElement("div"),S.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),L.appendChild(S),i.appendChild(L),!y&&!e.pFlags.out&&this.observer){(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._),t=M.length;if(e.reduce((e,t)=>e+t.length,0)===t&&e.length<=3&&I.length===e.length){if(a.a.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(M);if(1===e.length&&!E&&t)E={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),t.innerHTML=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&&m(w,P);const O=ra.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 _=u&&e.reply_markup;if(_&&"replyInlineMarkup"===_._&&_.rows&&_.rows.length){const t=_.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(ai.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 ii({[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"),i.insertAdjacentHTML("beforeend",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(Pe.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(Ws.a)(i),a=t[Object(Ws.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"),L.append(s)}const F=e.pFlags.is_outgoing;if(y){(e.pFlags.unread||F)&&this.unreadOut.add(e.mid);let t="";t=F?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}F&&i.classList.add("is-outgoing");const j=u&&this.appMessagesManager.getMessageWithReplies(e),D=!!j&&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"),M||i.classList.add("is-message-empty");let s=!1;switch(E._){case"messageMediaPhoto":{const s=E.photo;M||(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"),Vs({groupId:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:y,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:C,autoDownload:this.chat.autoDownload});break}const a=!ae.a&&k&&!D&&!1;a&&i.classList.add("with-media-tail"),js({photo:s,message:e,container:t,withTail:a,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:C,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));const c=t.document;if(c)if("gif"===c.type||"video"===c.type||"round"===c.type){const t="round"===c.type?b.b.active.round:b.b.active.webpage;"round"===c.type?(i.classList.add("round"),o.classList.add("is-round")):i.classList.add("video"),_s({doc:c,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:N,group:ec,loadPromises:C,autoDownload:this.chat.autoDownload})}else{const t=Fs({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:C,sizeType:"documentName"});o.append(t),o.classList.add("preview-with-document")}let d,h=document.createElement("div");if(h.classList.add("quote-text"),a&&h.append(a),t.site_name){const e=X.b.wrapRichText(t.url),s=Object(ai.a)(e).firstElementChild;s.classList.add("webpage-name");const i=document.createElement("strong");m(i,X.b.wrapEmojiText(t.site_name)),s.textContent="",s.append(i),h.append(s),d=s}if(t.rTitle){let e=document.createElement("div");e.classList.add("title");const s=document.createElement("strong");m(s,t.rTitle),e.append(s),h.append(e),d=e}if(t.rDescription){let e=document.createElement("div");e.classList.add("text"),m(e,t.rDescription),h.append(e),d=e}if(r.append(h),l&&!c){i.classList.add("photo");const t=l.sizes[l.sizes.length-1];let s=!1;t.w===t.h&&d?(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"),js({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:C,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,Bs({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:ec,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?M:void 0,withThumb:!0,loadPromises:C})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(x=!0),!s&&M||(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"),Vs({groupId:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:y,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:C,autoDownload:this.chat.autoDownload});else{const a=!ae.a&&!ae.b&&!s&&k&&!D&&!1;a&&i.classList.add("with-media-tail"),_s({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:ec,loadPromises:C,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=Fs({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});e.innerHTML=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:C,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(qa.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=[];e.first_name&&n.push(X.b.wrapEmojiText(e.first_name)),e.last_name&&n.push(X.b.wrapEmojiText(e.last_name)),t.innerHTML=`\n
\n
${n.join(" ")}
\n
${e.phone_number?"+"+Object(ti.a)(e.phone_number).formatted:"Unknown phone number"}
\n
`;const a=new bc;a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),a.classList.add("contact-avatar","avatar-54"),t.prepend(a),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 ws;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"),t.innerHTML=X.b.wrapEmojiText(R.from_name),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new Tt.a({peerId:B||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&u&&ra.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!==Ne.d&&!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(Jt(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 bc;t.classList.add("user-avatar","avatar-40"),t.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:(R&&(this.peerId===a.a.myId||this.peerId===Ne.d)||n?B:e.fromId)||Ne.c,peerTitle:!B&&R&&R.from_name?R.from_name:void 0,loadPromises:C}),L.append(t)}}else i.classList.add("hide-name");"pinned"===this.chat.type&&(z=`${this.chat.peerId}_${e.mid}`);if(j&&j.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!==Ne.d){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,C),D){ra.renderReplies({bubble:i,bubbleContainer:S,message:j,messageDiv:w,loadPromises:C,lazyLoadQueue:this.lazyLoadQueue})&&(k=!0)}return u&&this.appendReactionsElementToBubble(i,e),k&&(i.classList.add("can-have-tail"),S.append(lo())),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 ia;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=ra.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 so(this,void 0,void 0,(function*(){let s,n;e=e.slice(),i&&e.unshift(i),this.messagesQueueOnRender=()=>{if(s=new eo(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&&(ha(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(ca.a.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(ca.a.Top)||i.length&&!e.includes(i[i.length-1])||this.setLoaded("top",!0,!1)}else this.setLoaded("top",!0),this.setLoaded("bottom",!0);if(yield this.messagesQueuePromise,this.scrollable.loadedAll.top&&this.messagesQueueOnRenderAdditional&&(this.messagesQueueOnRenderAdditional(),this.messagesQueueOnRenderAdditional&&this.messagesQueueOnRenderAdditional()),s){s.restore(!(1===e.length&&!t));const i="has-sticky-dates",n=s.getSaved(),a=!this.preloader.detached;if(!(n.scrollHeight!==n.clientHeight)&&!a||this.bubblesContainer.classList.contains(i))this.willScrollOnLoad=void 0;else{const e=this.getMiddleware(),t=()=>{e()&&this.bubblesContainer.classList.add(i)};this.willScrollOnLoad?t():setTimeout(t,600)}}return!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 so(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(gi.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(Re.b)(()=>{this.setStickyDateManually(),d.forEach(e=>{e.classList.remove("zoom-fade")})}),(r.length||l.length||c.length)&&(y=Promise.all(v),Object(Ks.b)(y,Math.max(...f)+200).then(()=>{Object(Re.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(Ot.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 Bs({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:ec,play:!0,loop:!0,withThumb:!0,loadPromises:t}),Object(l.b)(a,e=>{Object(c.a)(e),Ka.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 Za(r.chat_invite_hash,r.chat_invite).show()}:r.chat_invite_hash?()=>{const e={_:Xa.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(Re.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(ks.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=Ya(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 eo(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,xt.a.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==ao){if(!ao)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--ao}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=>so(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(ca.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(Ks.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 lo(){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 co{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 Tt.a({peerId:e}).element],checked:!0})))}Object(wt.a)(h);new Lt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}function ho(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class po extends Lt{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&&bt({langPackKey:"ReportSentInfo"})}))}}],body:!0});const a=document.createElement("div");Bs({doc:Cs.a.getAnimatedEmojiSticker(po.STICKER_EMOJI),div:a,emoji:po.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)}}po.STICKER_EMOJI="👮‍♀️";class uo extends Lt{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=Cs.a.preloadAnimatedEmojiSticker(po.STICKER_EMOJI);Object(l.b)(this.body,a=>{const o=Object(Pe.a)(a.target,"btn-primary"),r=i[Object(Ws.a)(o)][1];n.then(()=>{this.hide(),new po(e,t,r,s)})},{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class go extends Lt{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 mo=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 bo extends wt.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 mo(this,void 0,void 0,(function*(){const e=this.appMessagesManager.getGroupsFirstMessage(this.message),t=this.appMessagesManager.canViewMessageReadParticipants(e),s=new ia,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 Wn({noShadow:!0,noDelimiter:!0}),o=Oc.createChatList({dialogSize:72});Oc.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 Et({scrollable:s,getPromise:()=>mo(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}=Oc.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");Bs({doc:zt.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 ta;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 vo="btn-menu-reactions-reaction",fo=!ae.g;class yo{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(Pe.a)(e.target,vo);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"),["big"].forEach(e=>{const t=document.createElement("div");t.classList.add("btn-menu-reactions-bubble","btn-menu-reactions-bubble-"+e),n.append(t)}),this.reactionsMap=new Map,this.animationGroup="CHAT-MENU-REACTIONS-"+Date.now(),M.a.setOverrideIdleGroup(this.animationGroup,!0),he.a||n.addEventListener("mousemove",this.onMouseMove),Object(l.b)(n,e=>{const t=Object(Pe.a)(e.target,vo);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(Gs.a)()}init(e){this.message=e;const t=this.middleware.get(),s=this.appReactionsManager.getAvailableReactionsByMessage(e);Object(Xt.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(Re.b)(i):i()})}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),M.a.setOverrideIdleGroup(this.animationGroup,!1),M.a.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return a.a.settings.animationsEnabled&&!ae.e}renderReaction(e){const t=document.createElement("div");t.classList.add(vo);const s=document.createElement("div");s.classList.add(vo+"-scale");const i=document.createElement("div");let n;i.classList.add(vo+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(vo+"-select","hide"));const a={selectWrapper:n,appearWrapper:i,reaction:e.reaction};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=28*(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;Bs(Object.assign({doc:e.appear_animation,div:i,play:!0},l)).then(e=>{Object(ks.a)(e),a.appear=e,e.addEventListener("enterFrame",o=>{e.maxFrame===o&&s.then(e=>{Object(ks.a)(e),i.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)},je.a)})},je.a);const s=Bs(Object.assign({doc:e.select_animation,div:n},l)).then(e=>(Object(ks.a)(e),oe.a.waitForFirstFrame(e))).catch(je.a)}else delete l.needFadeIn,delete l.withThumb,Bs(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=Ya(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(36,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=""}fo&&(s.style.transform=n)}}class wo{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(Pe.a)(e.target,"bubble-content-wrapper"),t=s?s.parentElement:Object(Pe.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=!ho(),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(Pe.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}=r,h=t.classList.contains("is-in")?"left":"right";Object(ee.e)(e.touches?e.touches[0]:e,i,h,d),Object(ee.d)(i,()=>{this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout(()=>{c()},300)})},this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionSendNowBtn):new oi(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(ho()){dt((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=()=>{dt(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"),mt(T.c.format(i,!0)),dt(n)},this.onPinClick=()=>{new co(this.peerId,this.mid)},this.onUnpinClick=()=>{new co(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 ii({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement(Object(Pe.a)(this.target,"grouped-item")||Object(Pe.a)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionDeleteBtn):new ni(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)},this.listenerSetter=new R.a,this.middleware=Object(Gs.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(ks.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:()=>{dt(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{dt(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(Pe.a)(this.target,"document")||!!Object(Pe.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 uo(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 bo(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 go},verify:()=>!1,isSponsored:!0}]}init(){this.cleanup(),this.setButtons();const e=this.filterButtons(this.buttons),t=this.element=Me(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 Tt.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 us({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;if("message"===this.message._&&!this.chat.selection.isSelecting&&!this.message.pFlags.is_outgoing&&!this.message.pFlags.is_scheduled){const e=ae.b||he.a?"horizontal":"vertical";n=this.reactionsMenu=new yo(this.appReactionsManager,e,this.middleware),n.init(this.appMessagesManager.getGroupsFirstMessage(this.message)),t.prepend(n.widthContainer);const s=42+8;i="vertical"===e?{top:24,left:s}:{top:s,right:36,left:24}}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove()},menuPadding:i}}}var So=s(191),Lo=s.n(So),Co=s(171);class Mo{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=Me(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 Io=s(94),Eo=s(114);class Po extends wt.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(It.a)(t,"LABEL"),i=Object(Eo.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(It.a)(t,"LABEL"),i=Object(Ws.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 Mo({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 St.a({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new St.a({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new St.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(Io.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(Io.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(Io.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 ut({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(Ws.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 ko=s(117);function To(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(ko.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 Mo({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=[],xo=void 0}),xo=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 St.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 St.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 mt(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=document.createElement("video"),a=document.createElement("source");a.src=t.objectURL=URL.createObjectURL(e),n.autoplay=!0,n.controls=!1,n.muted=!0,n.setAttribute("playsinline","true"),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([To(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||"",fileName:e.name?X.b.wrapEmojiText(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=Fs({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(Pa.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)),zs({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 _o=["ArrowUp","ArrowDown"],Fo=["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?_o.concat(Fo):"x"===t?Fo:_o);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(Pt.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(Pe.a)(e,"scrollable");e.classList.add("navigable-list");const b=t=>{const s=Object(ci.a)(t.target,e);s&&h(s,!1)},v=t=>{Object(c.a)(t);const s=Object(ci.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))},L=()=>{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,L())}}else L();return w(),{attach:w,detach:S,resetTarget:L}}class Do 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},j.a.pushItem(this.navigationItem)),this.addEventListener("hidden",()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",s(),this.navigationItem&&(j.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&&(j.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(ps.a)(this.container,"is-visible",!e,a.a.settings.animationsEnabled&&!s?300:0,()=>{this.hidden&&this.dispatchEvent("hidden")},i)}}class Ro extends Do{constructor(e,t){super({appendTo:e,controller:t,listType:"xy",onSelect:e=>!Ka.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(),Cs.a.preloadAnimatedEmojiSticker(e),Cs.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 Oa(this.lazyLoadQueue,ec)}}const Bo=()=>{const e=new Date;return e.setHours(0,0,0,0),e},No=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Uo extends Zn{constructor(e,t,s){var i;if(super((i=e).getTime()>No().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:Bo(),maxDate:No(),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 Ho=s(166),zo=s(105);function Vo(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(Ia(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=>{Ma(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 Go extends Do{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(Go.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(Go.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=Go.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=Go.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 bc;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?n.innerHTML=X.b.wrapEmojiText(e.name):n.append(new Tt.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"),i.innerHTML=X.b.wrapEmojiText(e.description),s.append(i)}return s}}function Wo(e,t){const s=[].concat(e.bot_info);let i;void 0!==t&&(i=new ma.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}Go.BASE_CLASS="autocomplete-peer-helper",Go.BASE_CLASS_LIST_ELEMENT=Go.BASE_CLASS+"-list-element";class qo extends Go{constructor(e,t,s,i,n){super(e,t,"commands-helper",e=>{const t=e.querySelector(`.${Go.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=Wo(t,e);this.render(i)}),!0}}class $o{constructor(){this.helpers=new Set,this.middleware=Object(Gs.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 Go{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 Yo=s(31);class Xo extends Ha{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;Object(ci.a)(t,this.element)||t===this.btnHover||(Object(c.a)(e),this.toggle(!1))},Object(w.a)(this,e),this.element.classList.add(Xo.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(Ks.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(Pe.a)(e.target,"btn");if(!t)return;const s=t.dataset.type,{peerId:i}=this;switch(s){case"keyboardButtonRequestPhone":Pn({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(Xo.BASE_CLASS+"-row");for(const s of t.buttons){const t=document.createElement("button");t.classList.add(Xo.BASE_CLASS+"-button","btn"),t.innerHTML=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()}}Xo.BASE_CLASS="reply-keyboard";var Jo=s(186),Zo=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 er extends Do{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)=>Zo(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 Ta(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"),n.innerHTML=X.b.wrapEmojiText([...e.title.trim()][0]);const s=document.createElement("div");s.classList.add("inline-helper-result-title"),s.innerHTML=X.b.wrapEmojiText(e.title);const i=document.createElement("div");i.classList.add("inline-helper-result-description"),i.innerHTML=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(Jo.a)(e).then(e=>{Ds(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(ks.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"),js({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");i.insertAdjacentHTML("beforeend",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(vt.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 Oa(this.lazyLoadQueue,"INLINE-HELPER")}}var tr=s(30);class sr extends Go{constructor(e,t,s){super(e,void 0,"bot-commands",e=>{const s=e.querySelector(`.${Go.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(Xt.a)(this.appProfileManager.getProfile(e),e=>{if(!t())return;const s=Wo(e),i=50*s.length+8+24;this.container.style.setProperty("--height",i+"px"),this.render(s)});this.toggle(!1)}}class ir{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(),Co.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 Uo(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}=Vo(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=ft.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();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 mt("Posting media content isn't allowed in this group.");this.chatInput.classList.add("is-locked"),Object(ri.a)(),this.recorder.start().then(()=>{this.releaseMediaPlayback=fe.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),Co.a.setKeepAlive(!0);const e=()=>{new Lt("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(Pe.a)(t.target,"chat-input")||Object(Pe.a)(t.target,"popup-cancel-record")||(Object(c.a)(t),e())},{capture:!0,passive:!1}),j.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=xe(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,Object(Re.b)(a)};a()}).catch(e=>{switch(e.name){case"NotAllowedError":mt("Please allow access to your microphone");break;case"NotReadableError":mt(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),mt(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 Lt("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(Pe.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=lo();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=$({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 St.a({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new St.a({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new St.a({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new St.a({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=Me(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=rt(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 Ha({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(ps.a)(this.sendAsCloseBtn,"is-visible",e,300,void 0,s),t||Object(ps.a)(h,"is-visible",!e,300,void 0,s)};if(Ee({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=$({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 Xo({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 sr(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 Po(this.chat).show()},verify:e=>e.isAnyChat()&&this.chat.canSend("send_polls")}],this.attachMenu=Ee({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 $o,this.stickersHelper=new Ro(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new Ko(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new qo(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 er(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 Mo({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),Wa.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(Wa)("open",this.onEmoticonsOpen),this.listenerSetter.add(Wa)("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===Ne.a?this.setStartParam():this.center(!0))}));try{this.recorder=new Lo.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 Oo(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&&(j.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"});Co.a.decode(e,!0).then(e=>{Co.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(vt.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(Ct.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 co(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(ps.a)(this.inputContainer,"is-centering",i,p),Object(ps.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(Io.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")),li(),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(Eo.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(Re.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(Xt.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(ps.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 Tt.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()}}ft.a.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(t),send_as:this.appPeersManager.getInputPeerById(e)})}:void 0,textElement:s}}),s=Me(t);t.forEach((t,s)=>{const i=e[s],n=new bc;n.classList.add("avatar-32","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 bc;a.classList.add("new-message-send-as-avatar","avatar-30"),a.updateWithOptions({isDialog:!1,peerId:e}),Object(ps.a)(a,"is-visible",!0,n,void 0,i),s&&Object(ps.a)(s,"is-visible",!1,n,()=>{s.remove()},i),this.sendAsContainer.append(a)}getDefaultSendAs(){return Object(Xt.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(Xt.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(),tr.a&&Object(tr.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(Ho.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(ko.a)(this.messageInput)}),he.a&&Object(l.b)(this.messageInput,e=>{this.appImManager.selectTab(1),Wa.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,"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=zo.b[e],a=i.commonAncestorContainer;(a.parentNode.matches(n.match)||a instanceof HTMLElement&&a.matches(n.match))&&(t=!0)}t?a.push(document.execCommand("fontName",!1,"Roboto")):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}insertAtCaret(e,t,s=!0){const{value:i,caretPos:n,entities:a}=Vo(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),c=s?r.match(ir.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=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=Vo(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(ir.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()?Ne.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(ps.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(ps.a)(this.btnPreloader,"show",!1,400)})}).catch(je.a)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Object(ps.a)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&(Object(ps.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 ii(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(Yo.a)(e),this.messageInputField.setValueSilently(s),Object(Yo.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(Eo.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(Io.a)(this.messageInputField.input);if(t){const e=this.editMessage;if(!o.trim()&&!e.media)return void new ni(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)?(mt("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=Wa.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(It.a)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=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 Tt.a({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e}),{forwardElements:c}=this;Object(It.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 Tt.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")&&(j.a.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){Object(ps.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(Re.b)(()=>{s&&Object(ko.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=Hs(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||j.a.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout(()=>{this.updateSendBtn()},0),c}}ir.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;class nr{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 ar extends nr{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new qe("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})=>{var i;let n,a;const o="voice"!==e.type&&"round"!==e.type;o?(n=e.audioTitle||e.fileName,a=e.audioPerformer||Object(T.d)("AudioUnknownArtist")):(n=new Tt.a({peerId:t.fromId,fromName:null===(i=t.fwd_from)||void 0===i?void 0:i.from_name}).element,a=Object(ne.d)(t.date)),this.fasterEl.classList.toggle("hide",o),this.repeatEl.classList.toggle("hide",!o),this.progressLine.setMedia(s),this.fill(n,a,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 Oe(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 Ae(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 or;!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"}(or||(or={}));class rr{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=or.ONE:2===e?s=or.TWO:3===e?s=or.THREE:4===e?s=or.FOUR:e>3&&(s=or.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=or.ONE:2===e?s=or.TWO:3===e?s=or.THREE:4===e?s=or.FOUR:e>3&&(s=or.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-or.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?or.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 lr=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 cr{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=cr.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=cr.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)},cr.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)}}cr.DURATION=200,cr.BASE_CLASS="animated-super";class dr{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=dr.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=dr.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=dr.BASE_CLASS+"-decimal-placeholder";const i=new cr;return i.container.className=dr.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()})},cr.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach(t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(dr.EMPTY_INDEX,!0);t.animatedSuper.animate(dr.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:dr.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)}),this.hideLeft(e),this.previousNumber=e}}dr.EMPTY_INDEX=-1,dr.BASE_CLASS="animated-counter";class hr{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 Qe("pinned-message");this.pinnedMessageContainer=new nr({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>lr(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new co(this.topbar.peerId,this.pinnedMid,!0):new co(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new rr,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new cr,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new cr,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new dr(!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(vt.a)(()=>this._setPinnedMessage(),100,!0,!0),this.setCorrectIndexThrottled=Object(Ts.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>hr.LOAD_COUNT&&(!this.loadedBottom&&e<=hr.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=hr.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return lr(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:hr.LOAD_COUNT,backLimit:hr.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 lr(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(Ks.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 lr(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 lr(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=$e({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)}))}}hr.LOAD_COUNT=50,hr.LOAD_OFFSET=5;var pr=$a,ur=s(42);class gr extends Lt{constructor(e){super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{i.a.mutePeer(e,-1===s?Ne.b:Object(ur.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 lt({radioField:new ut({langKey:e.langKey,name:"mute-time",value:""+e.time})}));let s;const n=ct(t,e=>{s=+e});t[t.length-1].radioField.checked=!0;const a=new Wn({noShadow:!0,noDelimiter:!0});a.content.append(n),this.body.append(a.container),this.show()}}class mr{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(!pr||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 gr(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 ar(this,this.chat,this.appMessagesManager),this.menuButtons.length&&(this.btnMore=Ee({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(Pe.a)(e.target,"pinned-container");if(Object(ri.a)(),t){if(Object(c.a)(e),Object(Pe.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(It.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);j.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),I.c.getState().then(t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{I.c.pushToState("chatContextMenuHintWasShown",!0),mt(Object(T.d)("Chat.Menu.Hint")),e.toggleByElement=s,e.toggleByElement(t)}})},verify:()=>!this.chat.selection.isSelecting&&!!Object.keys(this.chat.bubbles.bubbles).length},{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($t)){const e=new $t(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 Dt({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise((s,i)=>{new Lt("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new Tt.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 Lt("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new Tt.a({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then(e=>{e&&bt({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&&bt({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 Ht(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(ri.a)(),t(e)},{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructPeerHelpers(){return this.avatarElement=new bc,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 hr(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();I.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 hr(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 hr(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}I.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(Re.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 Tt.a({peerId:this.peerId,dialog:!0}).element),Object(k.a)(this.title,t),"chat"===this.chat.type&&this.title.append(...Zt(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 br 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 _("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 Zn(new Date,this.onDatePick).show()}),i&&this.appSearch.searchInput.inputField.setValueSilently(i),ds.toggleSidebar(!0)),n}}class vr{constructor(e,t,s){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{Object(c.a)(e),new Zn(new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=Object(It.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 _("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()}},j.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,j.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(Ws.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 fr{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find(t=>Object(ge.a)(t.options,e));return t||(t=new fr,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(Ss.b)(t,e,!1).then(()=>t)}cleanup(e){this.canvases.delete(e),this.canvases.size||(Object(V.a)(fr.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)))}}fr.INSTANCES=[];class yr 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=Ne.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=fr.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}=nn.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(ps.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(Ss.a)(i,e,a):a()});return this.setBackgroundPromise=Promise.race([Object(pa.a)(500),b])}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new mr(this,ds,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager,this.appGroupCallsManager),this.bubbles=new ro(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager,this.appChatsManager,this.appReactionsManager),this.input=new ir(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 ui(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new wo(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||Ne.c;if(!e)return ds.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.a.dispatchEvent("peer_changed",e);if(!i){const t=ds.getTab(br);t&&t.close(),this.noForwards=this.appPeersManager.noForwards(e),this.isRestricted=this.appPeersManager.isRestricted(e),this.container.classList.toggle("no-forwards",this.noForwards),ds.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=i,void 0===s&&this.isStartButtonNeeded()&&(s=Ne.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||(ds.sharedMediaTab.setLoadMutex(this.setPeerPromise),ds.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),ds.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===Ne.d||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(b.b.isMobile)this.search?this.search.setQuery(e):this.search=new vr(this.topbar,this,e);else{let t=ds.getTab(br);t||(t=new br(ds)),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}}}var wr=s(174);class Sr{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,j.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 zo.b){const i=zo.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=Ya(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(Se.a)(e.left,l,c)}else{const e=i.left+(i.width-o.width)/2;d=Object(Se.a)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),ho())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||j.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(ho(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 Lr(e,t,s,i,n,a,o){return[e,",",t," ",s," ",i,",",n," ",a,",",o].join("")}function Cr(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"+Lr(a,a,0,0,1,e+s,t+a)),l.push("V"+(t+i-o)),o>0&&l.push("A"+Lr(o,o,0,0,1,e+s-o,t+i)),l.push("H"+(e+r)),r>0&&l.push("A"+Lr(r,r,0,0,1,e+0,t+i-r)),l.push("V"+(t+n)),n>0&&l.push("A"+Lr(n,n,0,0,1,e+n,t+0)),l.push("Z"),l.join(" ")}le.a.generatePathData=Cr;class Mr{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=Cr(5,5,e.width-10,e.height-10,10,10,10,10);this.path.setAttributeNS(null,"d",t)}}function Ir(e){e.forEach(e=>e.classList.add("no-transition")),Object(Re.a)().then(()=>{e.forEach(e=>e.classList.remove("no-transition"))})}var Er=s(49),Pr=s(47),kr=s(135),Tr=s(126);class xr{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 Ar{constructor(e){this.stateId=e,this.createGradient(e)}createGradient(e){this.shader=(t,s,i,n,a)=>{t.fillStyle=Ar.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===Tr.a.MUTED_BY_ADMIN?(o.addColorStop(0,"#F05459"),o.addColorStop(.4,"#766EE9"),o.addColorStop(1,"#57A4FE")):t===Tr.a.UNMUTED?(o.addColorStop(0,"#52CE5D"),o.addColorStop(1,"#00B1C0")):t===Tr.a.MUTED?(o.addColorStop(0,"#0976E3"),o.addColorStop(1,"#2BCEFF")):t===Tr.a.CONNECTING&&(o.addColorStop(0,"#8599aa"),o.addColorStop(1,"#8599aa")),o}update(e,t,s,i){}}class Or{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([[Tr.a.UNMUTED,new Ar(Tr.a.UNMUTED)],[Tr.a.MUTED,new Ar(Tr.a.MUTED)],[Tr.a.MUTED_BY_ADMIN,new Ar(Tr.a.MUTED_BY_ADMIN)],[Tr.a.CONNECTING,new Ar(Tr.a.CONNECTING)]]),this.previousState=null,this.currentState=this.states.get(Tr.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 xr(3),this.lbd1=new xr(7),this.lbd2=new xr(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 _r=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 Fr{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 Fr(this,e)}getPart(e){return e instanceof Fr?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 Dr{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(je.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 Rr extends Dr{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(je.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 Br extends Rr{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"}]})}}class Nr extends Rr{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=_r.getProperty("gc-"+i+"-text-color");return s=Zi(n),s}(e):void 0}),this.colored=e;this.container.classList.add("group-call-participant-muted-icon-container");const t=Dr.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 Ur{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 m(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 Hr extends Qs{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)=>{qs(e.dom.listEl,this.list,t)},onElementCreate:t=>{const{dom:s}=Oc.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 Nr(!0),o=new Ur(["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:Re.b}),this.instance=e,this.avatarSize=54,this.rippleEnabled=!0,this.autonomous=!0,this.createChatListOptions={dialogSize:72},this.list=Oc.createChatList(this.createChatListOptions)}destroy(){this.elements.forEach(e=>{this.onElementDestroy(e)})}onElementDestroy(e){e.mutedIcon.destroy()}}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(He.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 Tt.a({peerId:this.appPeersManager.getPeerId(e.peer)}),i=this.peerTitle.element),this.groupCallParticipantMutedIcon=new Nr(!1),this.groupCallParticipantStatus=new Ur([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 ke{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(Pe.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=wt.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:()=>{Pn({peerId:this.targetPeerId,title:new Tt.a({peerId:this.targetPeerId}).element,descriptionLangKey:this.appChatsManager.isBroadcast(this.chatId)?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new Tt.a({peerId:this.targetPeerId}).element],button:{langKey:"VoiceChat.RemovePeer.Confirm.OK",isDanger:!0}}).then(()=>{this.appChatsManager.kickFromChat(this.chatId,this.targetPeerId)},je.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=Me(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Object(ee.a)(e.onContextElement,e=>{const t=Object(Pe.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(Te.a)(document.body,()=>{const e=Object(Te.d)();s=e?wt.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 Hr(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 Et({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===Tr.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 $r{constructor(e){this.appendTo=e,this.peerTitle=new Tt.a({peerId:0})}update(e){const{peerTitle:t,appendTo:s}=this,i=e.groupCall,n=e.chatId.toPeerId(!0);i.title?m(s,X.b.wrapEmojiText(i.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==s&&s.append(t.element))}}var Qr=!!("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 is({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")?xt.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")?xt.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(Pe.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=xt.a.height/2-this.height/2,this.left=xt.a.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=Object(Se.a)(this.width,this.minWidth,xt.a.width),this.height=Object(Se.a)(this.height,this.minHeight,xt.a.height)}fixPosition(){this.top=Object(Se.a)(this.top,0,xt.a.height-this.height),this.left=Object(Se.a)(this.left,0,xt.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 wt.b{constructor(e){super("popup-group-call",void 0,{body:!0,withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{Object(Te.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 Lt("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(Te.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&&(M.a.checkAnimations(e),a.a.setThemeColor(e?"#000000":void 0))},this.toggleBigLayout=()=>{var e;const t=Object(Te.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(Te.b)()},{listenerSetter:s}),Object(Te.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 $r(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(Pe.a)(t,"chatlist")||Object(Pe.a)(t,"group-call-button")||Object(Pe.a)(t,"btn-icon")||Object(Pe.a)(t,"group-call-participants-video-container")||Object(Te.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",!Qr);const n=t({noRipple:!0,callback:Object(Ts.a)(this.onMuteClick,600,!0)});n.classList.add("group-call-microphone-button");const a=this.groupCallMicrophoneIcon=new Br;n.append(a.container);const o=t({icon:"settings_filled"});o.classList.add("btn-disabled"),o.classList.toggle("hide",!Qr);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===Tr.a.CLOSED)return this.container.classList.contains("is-full-screen")&&Object(Te.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(182);!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=xe(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 Rr{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 wt.b{constructor(e){super("popup-call",void 0,{withoutOverlay:!0,closable:!0}),this.onFullScreenClick=()=>{Object(Te.e)(this.container)},this.onFullScreenChange=()=>{const e=Object(Te.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&&(M.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 bc;r.classList.add("avatar-full"),r.updateWithOptions({isBig:!0,peerId:o}),n.append(r);const c=new Tt.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(Te.b)(),{listenerSetter:s}),Object(Te.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 Tt.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(Pe.a)(t,"call-button")||Object(Pe.a)(t,"btn-icon")||Object(Te.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 ke;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)}});Qr||(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(Te.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(ps.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.innerHTML=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(Te.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(183),vl=s(162);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(159),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 Ll=s(189),Cl=s(157),Ml=s(143),Il=s(133);var El=s(51);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(179);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 _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];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 Fl{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 jl(){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 jl()?_l.generateOffer(e):Dl()?Fl.generateOffer(e):Ol.generateOffer(e)}static generateAnswer(e){return jl()?_l.generateAnswer(e):Dl()?Fl.generateAnswer(e):Ol.generateAnswer(e)}}var zl=s(144),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 Ll.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(Cl.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(vt.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(Ml.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=hn.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(Il.c)("audio",+e.audio.ssrc),e.video?Object(Il.c)("video",i(e.video.ssrcGroups)):void 0,e.screencast?Object(Il.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 Il.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 Tr.a.CLOSED;case dl.CONNECTED:return t?Tr.a.MUTED:Tr.a.UNMUTED;default:return Tr.a.CONNECTING}}(e.connectionState,s);const{weave:n}=this;n.componentDidMount();const a=i===Tr.a.CLOSED;(!document.body.classList.contains("is-calling")||t||a)&&(a&&n.setAmplitude(0),Object(ps.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 Tt.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(Ts.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 $r(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(wt.b.getPopups(rl).length)return;new rl({appGroupCallsManager:this.appGroupCallsManager,appPeersManager:this.appPeersManager,appChatsManager:this.appChatsManager}).show()}else if(this.instance instanceof Kl){if(wt.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 Or,p=h.render("topbar-call-weave");t.prepend(p),document.getElementById("column-center").prepend(t),h.componentDidMount()}}var Wl=s(176),ql=s(116),$l=s(25),Ql=s(120),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 ft.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 ft.a.invokeCrypto("compute-dh-key",e,t,s)}))}saveCall(e){const t="phoneCallDiscarded"===e._,s=this.calls.get(e.id);return s?(Object(Ql.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:ft.a,apiUpdatesManager:wi.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($s.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 ft.a.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then(e=>Yl(this,void 0,void 0,(function*(){return ft.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:Ne.c,date:Object(ur.a)(!0),id:--this.tempId,participant_id:e,protocol:a.protocol,pFlags:{video:t||void 0}}),this.generateDh().then(s=>(a.dh=s,ft.a.invokeApi("phone.requestCall",{user_id:E.a.getUserInput(e),protocol:a.protocol,video:t&&i,random_id:Object(ht.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($l.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 ft.a.invokeApi("phone.discardCall",{video:i,peer:this.getCallInput(e),duration:t,reason:{_:s},connection_id:"0"});wi.a.processUpdateMessage(n)}))}};le.a&&(le.a.appCallsManager=Xl);var Jl=Xl,Zl=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 ec="chat",tc=he.a?"touchstart":"mousemove";const sc=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){j.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(vt.a)(()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),ft.a.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)},a.a.settings.animationsEnabled?250:0,!1,!0),oe.a.setLoop(a.a.settings.stickers.loop),M.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=Ao();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 Oo(this.chat,e,i.willAttachType)}})}},wi.a.attach(),qt.a.start(),this.log=Object(Y.b)("IM",Y.a.Log|Y.a.Warn|Y.a.Debug|Y.a.Error),this.backgroundPromises={},I.b.settings.themes.forEach(e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg";this.backgroundPromises[e.background.slug]=Promise.resolve(t)}}),this.selectTab(0),window.addEventListener("blur",()=>{M.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),M.a.checkAnimations(!1),a.a.dispatchEvent("idle",a.a.idle.isIDLE)},{once:!0})}),window.addEventListener(tc,()=>{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),j.a.onHashChange=this.onHashChange,this.setSettings(),a.a.addEventListener("settings_updated",this.setSettings),Object(Ks.a)(()=>{M.a.setOnlyOnePlayableGroup("lock"),M.a.checkAnimations(!0)},()=>{M.a.setOnlyOnePlayableGroup(""),M.a.checkAnimations(!1)}),this.applyCurrentTheme(),b.b.addEventListener("changeScreen",(e,t)=>{document.body.classList.contains("is-left-column-shown")&&document.body.classList.contains("is-right-column-shown")&&ds.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)}),b.b.addEventListener("resize",()=>{const e=this.chatsContainer.getBoundingClientRect();fr.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")&&Ya(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 wt.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"),Er.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=>{Pn({button:{langKey:"OK",isCancel:!0},description:X.b.wrapRichText(e.message)})}),ba.a.get("chatPositions").then(e=>{ba.a.setToCache("chatPositions",e||{})}),(Qa||pr)&&(this.topbarCall=new Gl(kr.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=>{bt({langPackKey:"VoipPeerIncompatible",langPackArguments:[new Tt.a({peerId:e.toPeerId()}).element]})})),Er.a.activateInstance();const e=()=>{Pr.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 Lt("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={_:Xa.STICKER_SET,set:e[1]};this.processInternalLink(t)}}),this.addAnchorListener({name:"joinchat",callback:({pathnameParams:e})=>{const t={_:Xa.JOIN_CHAT,invite:e[1]||decodeURIComponent(e[0]).slice(1)};this.processInternalLink(t)}}),pr&&this.addAnchorListener({name:"voicechat",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Xa.VOICE_CHAT,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"im",callback:({pathnameParams:e,uriParams:t})=>Zl(this,void 0,void 0,(function*(){let s;s=X.b.PHONE_NUMBER_REG_EXP.test(e[0])?{_:Xa.USER_PHONE_NUMBER,phone:e[0].slice(1)}:"c"===e[0]?{_:Xa.PRIVATE_POST,channel:e[1],post:e[2],thread:"thread"in t&&t.thread,comment:t.comment}:{_:Xa.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(Xa.USER_PHONE_NUMBER,e):"telegrampassport"===e.domain||(t=this.makeLink(Xa.MESSAGE,e)),this.processInternalLink(t)}}),this.addAnchorListener({name:"privatepost",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Xa.PRIVATE_POST,e);this.processInternalLink(t)}}),this.addAnchorListener({name:"addstickers",protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Xa.STICKER_SET,e);this.processInternalLink(t)}}),["joinchat","join"].forEach(e=>{this.addAnchorListener({name:e,protocol:"tg",callback:({uriParams:e})=>{const t=this.makeLink(Xa.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]}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(ca.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(ko.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 Zl(this,void 0,void 0,(function*(){switch(null==e?void 0:e._){case Xa.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 Xa.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 bt({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 Xa.STICKER_SET:new cn({id:e.set}).show();break;case Xa.JOIN_CHAT:ft.a.invokeApi("messages.checkChatInvite",{hash:e.invite}).then(t=>{t.chat&&G.a.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Za(e.invite,t).show():this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})},e=>{"INVITE_HASH_EXPIRED"===e.type&&mt(Object(T.d)("InviteExpired"))});break;case Xa.VOICE_CHAT:pr&&this.joinGroupCall(e.chat_id.toPeerId(!0),e.id);break;case Xa.USER_PHONE_NUMBER:E.a.resolvePhone(e.phone).then(e=>{this.setInnerPeer({peerId:e.id.toPeerId(!1)})}).catch(e=>{"PHONE_NOT_OCCUPIED"===e.type&&bt({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?bt({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&&bt({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 Zl(this,void 0,void 0,(function*(){if(Jl.getCallByUserId(e))return;(yield n.default.getProfile(e)).pFlags.phone_calls_private?Pn({descriptionLangKey:"Call.PrivacyErrorMessage",descriptionLangArgs:[new Tt.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 kr.a.groupCall&&kr.a.groupCall!==t?this.discardGroupCallConfirmation(e):Jl.currentCall&&Jl.currentCall!==s?this.discardCallConfirmation(e):Promise.resolve()}discardCallConfirmation(e){return Zl(this,void 0,void 0,(function*(){const t=Jl.currentCall;t&&(yield Pn({titleLangKey:"Call.Confirm.Discard.Call.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Call.ToCall.Text":"Call.Confirm.Discard.Call.ToVoice.Text",descriptionLangArgs:[new Tt.a({peerId:t.interlocutorUserId.toPeerId(!1)}).element,new Tt.a({peerId:e}).element],button:{langKey:"OK"}}),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Zl(this,void 0,void 0,(function*(){const t=kr.a.groupCall;t&&(yield Pn({titleLangKey:"Call.Confirm.Discard.Voice.Header",descriptionLangKey:e.isUser()?"Call.Confirm.Discard.Voice.ToCall.Text":"Call.Confirm.Discard.Voice.ToVoice.Text",descriptionLangArgs:[new Tt.a({peerId:t.chatId.toPeerId(!0)}).element,new Tt.a({peerId:e}).element],button:{langKey:"OK"}}),kr.a.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Zl(this,void 0,void 0,(function*(){const s=e.toChatId(),i=G.a.hasRights(s,"manage_call");if(t){if("groupCallDiscarded"===(yield kr.a.getGroupCallFull(t))._){if(!i)return void bt({langPackKey:"VoiceChat.Chat.Ended"});yield Pn({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}}yield this.discardCurrentCall(e),(()=>{Zl(this,void 0,void 0,(function*(){const e=yield n.default.getChatFull(s);let t;if(e.call)t=kr.a.saveGroupCall(e.call,s);else{if(!i)return;t=yield kr.a.createGroupCall(s)}kr.a.joinGroupCall(s,t.id,!0,!1)}))})()}))}setCurrentBackground(e=!1){const t=a.a.getTheme();if(t.background.slug){const s=I.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.setBackground("",!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=ba.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(gi.a)(t.bubbles,"desc"),top:e};i[s]=n,this.log("saved chat position:",n)}ba.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=ba.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 tn(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&&Ir([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.a.settings.animationsEnabled&&!1!==t&&Object(Ks.b)(Object(pa.a)(400),400);const s=Object(Ws.a)(this.prevTab);Object(Ws.a)(e)>s&&j.a.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),Object(ri.a)()}})}e.classList.add("active"),this.prevTab=e}}init(){document.addEventListener("paste",this.onDocumentPaste,!0),he.a||this.attachDragAndDropListeners(),this.markupTooltip=new Sr(this),this.markupTooltip.handleSelection()}attachDragAndDropListeners(){const e=[],t=[];let s=!1;const i=(r,l)=>Zl(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=Ao();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 Mr(p,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),sc.log("drop",e),sc.onDocumentPaste(e,"document")}}))):((e.length||t)&&u.push(new Mr(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),sc.log("drop",e),sc.onDocumentPaste(e,"document")}})),(s||t)&&u.push(new Mr(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),sc.log("drop",e),sc.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}Object(ps.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&&Ir([Xn.sidebarEl,this.columnEl,ds.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(Re.a)():Promise.resolve();if(-1!==s&&s!==e&&a.a.settings.animationsEnabled&&!1!==t){const e=100+(b.b.isMobile?250:200);i=Object(pa.a)(e),Object(Ks.b)(i,e)}return this.tabId=e,Object(ri.a)(),b.b.isMobile&&2===s&&e<2&&document.body.classList.remove("is-right-column-shown"),-1!==s&&e>s&&(e<2||!j.a.findItemByType("im"))&&j.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),ft.a.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new yr(this,G.a,C.a,Da,i.a,o.a,r.a,n.default,Cs.a,E.a,wr.a,nt.a,ft.a,Wi.a,at.a,ba.a,qt.a,wa,v.a,kr.a,zt.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=ds.getTab(br);e&&e.close();ds.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(ds.sharedMediaTab.loadSidebarMedia(!0),ds.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=Ne.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===Ne.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 Tt.a({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]),"sendMessageEmojiInteractionSeen"===r._){c?c.pop():c=[];const e=Object(De.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 Zl(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(Ja.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=sc);var ic=sc;var nc=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 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(Pe.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(Pe.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 bc,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 Le({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 is({element:this.wholeDiv,onSwipe:(e,t)=>{if(Object(Te.d)())return;if(Math.abs(e)/xt.a.width>.2||e>125)return e<0?this.buttons.prev.click():this.buttons.next.click(),!0;return(Math.abs(t)/xt.a.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!Object(Pe.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 is({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=Ee({onlyMobile:!0},"bottom-left",e);this.topbar.append(t)}close(e){var t;if(e&&Object(c.a)(e),this.setMoverAnimationPromise)return Promise.reject();j.a.removeByType("media"),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=void 0,this.zoomSwipeHandler&&(this.zoomSwipeHandler.removeListeners(),this.zoomSwipeHandler=void 0),window.removeEventListener("keydown",this.onKeyDown),window.removeEventListener("keyup",this.onKeyUp),window.removeEventListener("wheel",this.onWheel,{capture:!0}),s.finally(()=>{this.wholeDiv.remove(),a.a.isOverlayActive=!1,M.a.checkAnimations(!1)}),s}setMoverToTarget(e,t=!1,s=0){return nc(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 bc||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=Object(Pe.a)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=Object(Pe.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=Ya(l,Object(Pe.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?xt.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=xt.a.width/2-c.width/2,t=xt.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"),L=this.setMoverAnimationPromise=Object(ie.a)(),C={onAnimationEnd:L},M=setTimeout(()=>{L.isFulfilled||L.isRejected||L.resolve()},1e3);if(L.finally(()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===L&&(this.setMoverAnimationPromise=null),clearTimeout(M)}),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.wholeDiv.classList.add("backwards"),setTimeout(()=>{this.wholeDiv.classList.remove("active")},0),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;",L.resolve()},r),i.classList.remove("opening"),C;{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=document.createElement("video"),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?Cr(0,0,n-9/b,a,...s):Cr(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(Ss.b)(t,s))),i.style.display="",Object(Re.b)(()=>{i.classList.add(o?"moving":"active")})}return i.classList.add("opening"),yield Object(Re.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,L.resolve()},r),w&&this.sizeTailPath(w,h,b,r,!0,S,f),C}))}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?Cr(0,0,l-9/s*o,c,...p):Cr(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(Pe.a)(e,"document")){if(Object(Pe.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(Ss.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 Tt.a({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.innerHTML=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||Ne.c,peerTitle:s?void 0:""+e}),n.parentElement.replaceChild(this.author.avatarEl,n)}_openMedia(e,t,s,i,n,o=!1,l=[],d=[],h){return nc(this,void 0,void 0,(function*(){if(this.setMoverPromise)return this.setMoverPromise;this.setAuthorInfo(s,t);const p="document"===e._,u=p&&e.mime_type&&(["video","gif"].includes(e.type)||0===e.mime_type.indexOf("video/"));this.isFirstOpen&&(this.isFirstOpen=!1,this.listLoader.setTargets(l,d,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,m=!n||n===g;m&&(n=g),this.target={element:n};const v=++this.tempId;g.firstElementChild&&(g.innerHTML="");if(0!==i)this.moveTheMover(this.content.mover,1===i),this.setNewMover();else{a.a.isOverlayActive=!0,window.addEventListener("keydown",this.onKeyDown),window.addEventListener("keyup",this.onKeyUp),he.a||window.addEventListener("wheel",this.onWheel,{passive:!1,capture:!0});const e=document.getElementById("main-columns");this.pageEl.insertBefore(this.wholeDiv,e),this.wholeDiv.offsetLeft,this.wholeDiv.classList.add("active"),M.a.checkAnimations(!0),ae.f||j.a.pushItem({type:"media",onPop:e=>{if(this.setMoverAnimationPromise)return!1;this.close()}})}const f=this.content.mover,y=xt.a.width;let w=0;const S=xt.a.height;S<1e6&&!b.b.isMobile&&(w=120);const L=S-120-w;let I=Promise.resolve();const E=r.a.setAttachmentSize(e,g,y,L,!b.b.isMobile,void 0,!!(p&&e.w&&e.h)).photoSize;if(m){const t=ce.a.getCacheContext(e,E.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.a.getStrippedThumbIfNeeded(e,t,!0);i&&(I=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),g.append(s))}const P=!(!p||!e.supportsStreaming),k=P?this.preloaderStreamable:this.preloader;let T;if(u){const t=h&&"gif"!==e.type,s=document.createElement("video"),a=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:i})=>{const a=f.firstElementChild&&f.firstElementChild.classList.contains("media-viewer-aspecter")?f.firstElementChild:f,o=f.querySelector("video");o&&o.remove(),s.setAttribute("playsinline","true"),s.addEventListener("timeupdate",()=>{this.tempId!==v&&s.pause()}),s.addEventListener("error",()=>{4!==s.error.code&&this.log.error("Error "+s.error.code+"; details: "+s.error.message),k&&k.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!==v)return;(this.videoPlayer=new _e({video:s,play:!0,streamable:P,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)}})).addEventListener("toggleControls",e=>{this.wholeDiv.classList.toggle("has-video-controls",e)}),this.addEventListener("setMoverBefore",()=>{this.wholeDiv.classList.remove("has-video-controls"),this.videoPlayer.removeListeners(),this.videoPlayer=void 0},{once:!0}),this.isZooming()&&this.videoPlayer.lockControls(!1)}))};if(P){i.then(()=>{s.readyState{s.addEventListener("canplay",()=>{k.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=P?Promise.resolve():C.a.downloadDoc(e);return P||i.then(()=>{o.url||k.attach(f,!0,r)}),Promise.all([r,i]).then(()=>{if(this.tempId!==v)return void this.log.warn("media viewer changed video");const e=o.url;if(n instanceof SVGSVGElement?a.firstElementChild.lastElementChild.append(s):Object(Ss.a)(s,e),t){const e=fe.setSingleMedia(s,h);this.addEventListener("setMoverBefore",()=>{e()},{once:!0})}this.updateMediaSource(n,e,"video"),l()}),r}})});T=I.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=ce.a.getCacheContext(e,E.type),i=p?C.a.downloadDoc(e):r.a.preloadPhoto(e,E);return t.then(()=>{s.url||this.preloader.attachPromise(i)}),Promise.all([t,i]).then(()=>{var e;if(this.tempId!==v)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(f,t,"img"),b.b.isMobile){const e=f.querySelectorAll("img");e&&e.length&&e.forEach(e=>{e.classList.remove("thumbnail")})}}else{const s=f.firstElementChild&&f.firstElementChild.classList.contains("media-viewer-aspecter")?f.firstElementChild:f,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(Ss.a)(e,t,()=>{this.updateMediaSource(n,t,"img"),i&&Object(Re.b)(()=>{i.remove()}),s.append(e)})}}}).catch(e=>{this.log.error(e),this.preloader.attach(f),this.preloader.setManual()}),i}})});T=I.then(t)}return this.setMoverPromise=T.catch(()=>{this.setMoverAnimationPromise=null}).finally(()=>{this.setMoverPromise=null})}))}}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 ac{constructor(){let e;super(new L({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.a.getMediaFromMessage(e);if(a&&(!t||rc.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 ni(e.peerId,[e.mid],"chat",()=>{this.target={element:this.content.media},this.close()})},this.onForwardClick=()=>{const e=this.target;e.mid&&new ii({[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=ds.getTab(ls);e&&e.close()}ic.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,ic.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&C.a.saveDocFile(e,ic.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})),m(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 oc(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 lc 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 cc=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 dc extends ac{constructor(e){super(new lc({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),ic.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 cc(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 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())}))};const pc=e=>{d.a.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[data-peer-id="'+e+'"]')).forEach(e=>{e.update()})};function uc(e,t,s,a,o,l){return hc(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 rc).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(ua.a)(a)&&a&&(c=r.a.getPhoto(a));const e=e=>e.map(e=>({element:e.element,photoId:e.item}));new dc(t).openMedia(c.id,d(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.a.addEventListener("avatar_update",pc),a.a.addEventListener("peer_title_edit",e=>{d.a.isAvatarCached(e)||pc(e)});const gc=new Map,mc=new Set;class bc extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}disconnectedCallback(){const e=gc.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||gc.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}attachClickEvent(){let e=!1;Object(l.b)(this,t=>hc(this,void 0,void 0,(function*(){if(Object(c.a)(t),e)return;const s=this.peerId;e=!0,yield uc(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=gc.get(t);e&&(e.delete(this),e.size||gc.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(!mc.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=gc.get(this.peerId);return e||(e=new Set,gc.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(mc.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}mc.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally(()=>{this.addedToQueue=!1});const s=gc.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);gc.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?bt({langPackKey:"PinFolderLimitReached"}):new Lt("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new Cn(Xn).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 gr(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 Ht(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=Object(It.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=Oc.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&&!qt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.a.myId&&qt.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=Me(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var fc,yc;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(fc||(fc={}));class wc{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{Kn.a.get("dc").then(e=>{e||(e=Vn.a.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.a.connectionStatus["NET-"+e],s=t&&t.status===fc.Connected;this.connecting&&s&&wi.a.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===fc.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=wc.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",()=>ft.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",()=>ft.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(ps.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,wc.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 Sc(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()}wc.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"}(yc||(yc={}));const Lc=window.devicePixelRatio,Cc=20*Lc,Mc=2.5*Lc,Ic=2*Lc,Ec=1*Lc;function Pc(e=!1){const t=document.createElement("canvas");t.width=t.height=Cc;const s=t.getContext("2d"),i=(Cc-(3*Ic+2*Mc))/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,Cc,Cc),s.fillStyle=e&&!b.b.isMobile?_r.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*=Lc;Sc(s,i+e*Ic+e*Mc,(Cc-n)/2,Ic,n,Ec,!0)}return!0};return{canvas:t,startAnimation:()=>{Object(He.a)(o),o()},setActive:t=>{e=t,o()}}}var kc=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 Tc extends Qs{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;qs(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=Ac.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:Re.c}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class xc{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 vc,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 Wn({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 Xs({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=xt.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(Re.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(vt.a)(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),he.a&&ei({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",()=>{I.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}},j.a.unshiftItem(this.filtersNavigationItem)):this.filtersNavigationItem&&(j.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(),I.c.getState().then(e=>this.onStateLoaded(e)),b.b.addEventListener("resize",()=>{this.changeFiltersAllChatsKey()}),new wc(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(ps.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),qs(n.menu,t,s.orderIndex),qs(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 kc(this,void 0,void 0,(function*(){if(e.notifySettings)for(const t in e.notifySettings)Object(ks.a)(t),qt.a.savePeerSettings({key:t,settings:e.notifySettings[t]});qt.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)),I.c.storagesResults.dialogs.length&&Wi.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)&&!qt.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 Tc(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):i.innerHTML=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);qs(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;qs(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=>kc(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=xt.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=Cs.a.getAnimatedEmojiSticker(e);return n?Bs({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 Sn(Xn).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(Ss.b)(e,"assets/img/EmptyChats.svg"),Object(Re.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?ic.setInnerPeer:ic.setPeer).bind(ic);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=Object(It.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(It.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"),js({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 Tt.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=qt.a.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&Object(ps.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(ps.a)(t.unreadBadge,"is-visible",d,g,d?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&Object(ps.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||Ne.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=Pc(i.classList.contains("active"));t.classList.add("dialog-group-call-icon"),i.append(t),n()}s&&Object(ps.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;qt.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(!pr)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=Ac.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 bc;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 Tt.a({peerId:b,fromName:p,dialog:o,onlyFirstName:n,plainText:!1});y.append(w.element),y.classList.add("tgico"),y.append(...Zt(b));const S=document.createElement("span");S.classList.add("user-last-message"),S.setAttribute("dir","auto");const L=document.createElement("li");L.classList.add("chatlist-chat"),i&&Object(te.a)(L),L.append(v,f),L.dataset.peerId=""+b;const C=document.createElement("span");C.classList.add("message-status","sending-status");const M=document.createElement("span");M.classList.add("message-time");const I=document.createElement("div");I.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(C,M),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:C,lastTimeSpan:M,unreadBadge:I,lastMessageSpan:S,containerEl:L,listEl:L,subtitleEl:T};if(t){t[r?"append":"prepend"](L)}return c||(L.dialogDom=x,(null===(g=ic.chat)||void 0===g?void 0:g.peerId)===b&&this.setDialogActive(L,!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=ic.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 Ac=new xc;le.a.appDialogsManager=Ac;var Oc=t.default=Ac},191: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}])},65: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(101),o=s(91),r=s(32);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"}}},68:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(34),n=s(75),a=s(7),o=s(44);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)}}},76: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}))},82:function(e,t,s){"use strict";function i(e,t){return e.closest(t)}s.d(t,"a",(function(){return i}))},92: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=11.485cff055ef366a5dc5a.chunk.js.map \ No newline at end of file diff --git a/public/11.485cff055ef366a5dc5a.chunk.js.map b/public/11.485cff055ef366a5dc5a.chunk.js.map deleted file mode 100644 index 106abb86..00000000 --- a/public/11.485cff055ef366a5dc5a.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/dom/setInnerHTML.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/dom/attachGrabListeners.ts","webpack:///./src/components/rangeSelector.ts","webpack:///./src/components/buttonMenu.ts","webpack:///./src/components/buttonMenuToggle.ts","webpack:///./src/helpers/dom/controlsHover.ts","webpack:///./src/helpers/string/toHHMMSS.ts","webpack:///./src/lib/mediaPlayer.ts","webpack:///./src/helpers/schedulers/throttleWithRaf.ts","webpack:///./src/helpers/schedulers/throttleWith.ts","webpack:///./src/helpers/formatBytes.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/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/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/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/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/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/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/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","setInnerHTML","elem","html","innerHTML","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","filterMessagesByInputFilter","context","setSearchContext","reset","ret","goUnsafe","goToOtherEnd","unsetCurrent","changed","removeEventListener","cleanup","clearable","className","clickable","autonomous","onFound","list","createChatList","nameEl","setListClickListener","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","_volume","_muted","_playbackRate","_loop","_round","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","getMessageByMedia","setMedia","verify","element","listLoader","getCurrent","getPrevious","jumpLength","findIndex","getNext","setTargets","getPlayingDetails","onPause","onEnded","isTrusted","lockedSwitchers","paused","clean","s","playingMediaType","playItem","getMedia","resolveWaitingForLoadMedia","goRound","cssText","mediaSession","actions","seekbackward","seekforward","seekto","previoustrack","nexttrack","setActionHandler","warn","properties","_key","dispatchPlaybackParams","Object","defineProperties","getPlaybackParams","volume","muted","autoload","pFlags","is_scheduled","getMediaFromMessage","media_unread","myId","readMessages","once","deferred","w","waitingStorage","downloadDoc","safariBuffering","artwork","isVoice","artist","thumbs","bytes","sizes","h","preloadPhoto","setNewMediadata","peerPhoto","getPeerPhoto","loadAvatar","cached","getPeerTitle","attribute","attributes","file_name","performer","metadata","MediaMetadata","getScheduledMessageByPeer","getMessageByPeer","playbackParams","willBePlayedMedia","deepEqual","copy","prev","addMedia","mediaType","getPlaybackMediaTypeFromMessage","wasPlaying","willBePlayed","toggleSwitchers","enabled","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","decimals","_removeListeners","percents","clamp","transform","rectMax","offsetAxisValue","bottom","left","toFixed","ButtonMenuItem","text","onClick","checkboxField","noCheckboxClickListener","ripple","textElement","textArgs","regularText","keepOpen","cancelEvent","checked","buttons","ButtonMenuToggleHandler","openedMenu","asDiv","btnMenu","hideControls","setHideTimeout","hideControlsTimeout","isShown","controlsLocked","canHideControls","showControls","toggleControls","show","ignoreClickClassName","findUpClassName","relatedTarget","showOnLeaveToClassName","visible","toHHMMSS","str","leadZero","sec_num","parseInt","hours","floor","minutes","seconds","streamable","progressRAF","onLoadedData","r","requestAnimationFrame","cancelAnimationFrame","setLoadProgress","onTimeUpdate","onProgress","removeListeners","filledLoad","setSeekMax","setListeners","setHandlers","scrubTime","isSafariBuffering","buf","buffered","numRanges","nearestStart","end","start","onMuteClick","setVolume","iconIndex","ICONS","btn","onPlaybackRackMenuToggle","wrapper","setup","playbackRateButton","parentNode","appendChild","skin","stylePlayer","setBtnMenuToggle","controls","progress","finally","initDuration","buildControls","timeDuration","insertAdjacentHTML","fullScreenButton","timeElapsed","volumeSelector","leftControls","togglePlay","overlaysActive","good","toggleFullScreen","altKey","nextIdx","PLAYBACK_RATES","onFullScreen","setPlaybackRateIcon","rate","PLAYBACK_RATES_ICONS","player","webkitEnterFullscreen","enterFullscreen","isFull","throttleWithRaf","fn","schedulerFn","waiting","_args","throttleWith","formatBytes","dm","log","parseFloat","pow","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","barX","sumI","bar_value","barWidth","createWaveformBars","fakeSvgContainer","waveformContainer","timeDiv","throttledTimeUpdate","addAudioListener","readyPromise","mousemove","offsetX","MouseEvent","targetTouches","noop","constructDownloadPreloader","tryAgainOnFail","preloader","cancelable","construct","circle","totalLength","attr","findMediaTargets","anchorMid","isBubbles","justAudioSelector","selectors","matches","prefix","selector","join","elements","mediaItems","toPeerId","HTMLElement","withTime","voiceAsMusic","showSender","isRealVoice","isOutgoing","is_outgoing","uploading","durationStr","firstElementChild","downloadDiv","onTypeLoad","descriptionEl","parts","audioPerformer","htmlToSpan","date","wrapSenderToPeer","titleEl","middleEllipsisEl","fontWeight","sizeType","audioTitle","fileName","wrapSentTime","subtitleDiv","launched","progressLine","lastChild","replaceWith","wrapAudio","audioTimeDiv","onLoad","readyState","HAVE_CURRENT_DATA","onTypeDisconnect","getTimeStr","innerText","hadSearchContext","useSearch","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","wrapEmojiText","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","freezed","radioField","subtitleLangKey","subtitleLangArgs","havePadding","isToggle","titleRight","noCheckboxSubtitle","titleLangKey","c","titleRightSecondary","titleRightEl","navigationTab","RadioFormFromRows","rows","copyTextToClipboard","clipboard","writeText","textArea","top","position","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","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","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","flushHistory","callbackDelete","descriptionArgs","deleteChannel","isDanger","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","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","rQuestion","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","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","cb","getPercentValue","iterate","fullTime","votersCount","multiplier","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","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","descriptionParts","nameDiv","_downloadDiv","save","canOpenAfter","downloading","saveDocFile","noThumb","noFadeIn","blurAfter","setAttachmentSize","regular","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","getStrippedThumbIfNeeded","needFadeIn","renderOnLoad","renderImageWithFadeIn","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","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","SORT_INTERVAL","handleHorizontalSwipe","cancelY","isSwipingBackSafari","handleTabSwipe","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","setLastMessage","elemsToAppend","entity","totalEntities","display_url","sliced","matchUrl","same","hostname","hash","rDescription","previewDiv","getAbbreviation","rTitle","subtitleFragment","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","wrapPlainText","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","PrivacyType","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","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","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","getSelf","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","wrapDraftText","ul","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","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","menu","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","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","getDialogOnly","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","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","mediaSize","quoteTextDiv","site_name","strong","textDiv","isSquare","emojiSticker","animatedSticker","staticSticker","newNameContainer","wrapGroupedDocuments","lastContainer","formatCallDuration","reason","contact","texts","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","isLoading","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","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","closest","reactionsMenu","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","totalSize","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","question","quizSolution","force","quizSolutionEntities","inputMediaPoll","getInputMediaPoll","getMessageSendingParams","helperType","clearHelper","questionField","getGifDuration","arrayBuffer","currentPopup","getCurrentNewMediaPopup","files","willAttachType","confirmShortcutIsSendShortcut","onKeyDown","attachFile","willAttach","shouldCompress","params","itemDiv","attachMedia","attachDocument","sendFileDetails","mediaContainer","caption_length_max","wasInputValue","messageInputField","attachFiles","groupCheckboxField","mediaCheckboxField","toPush","_file","lastModified","isMedia","sendingParams","sendAlbum","replyToMsgId","startsWith","source","objectURL","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","navigationItem","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","appWebPagesManager","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","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","onPlaybackParams","fasterEl","repeatEl","toggleEl","onStop","onMediaPlay","isMusic","fromName","prevEl","nextEl","attachClick","volumeProgressLineContainer","tunnel","progressWrapper","playingDetails","BAR_HEIGHTS","PinnedMessageBorder","drawRect","getClipPath","barHeight","GAP","clipPath","path","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","callVideoCanvasBlur","renderFrame","groupCallParticipantMutedIcon","groupCallParticipantStatus","updateParticipant","participantsElements","groupCallId","setElementDisplay","pinnedSource","pinSource","unpinAll","setInstance","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","resizeInstances","saveChatPosition","choosing","setChoosingStickerTyping","typings","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","activatingChat","screen","IGNORE_KEYS","isOverlayActive","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","getFile","lastBackgroundUrl","chatBubbles","chatPositions","getFromCache","themeColor","hslaStringToHex","backgroundUrl","applyHighlightningColor","setTheme","setCurrentBackground","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","descriptionElement","ignoreSelf","getPeerTyping","onlines","getOnlines","useWhitespace","typingContainer","getPeerStatus","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","closing","fromRight","removeCenterFromMover","wasActive","realParent","SVGImageElement","SVGForeignObjectElement","needOpacity","HTMLImageElement","HTMLVideoElement","setFullAspect","scaleX","scaleY","brSplitted","fillPropertyValue","willBeLeft","willBeTop","isRejected","SVGSVGElement","sizeTailPath","mediaElement","clipId","newClipId","newSvg","outerHTML","SVGUseElement","sX","sY","upscale","_br","toLeft","windowW","newTransform","p1","newMover","oldAvatar","replaceChild","setAuthorInfo","isDocument","useContainerAsTarget","moveTheMover","mainColumns","padding","windowH","thumbPromise","useController","moverVideo","canPlayThrough","createPlayer","ckin","overlay","HAVE_FUTURE_DATA","attachCanPlay","networkState","NETWORK_LOADING","isntEnoughData","rollback","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","perf","performance","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","allChatsIntlElement","addFilter","onStateLoaded","foldersScrollable","filtersNavigationItem","unshiftItem","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":"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","file":"11.485cff055ef366a5dc5a.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","/*\r\n * https://github.com/morethanwords/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) {\r\n elem.setAttribute('dir', 'auto');\r\n elem.innerHTML = html;\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;\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.filterMessagesByInputFilter(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 /* 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) {\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 && this.otherSideLoader && value/* && (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\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 = 1;\r\n private _muted = false;\r\n private _playbackRate = 1;\r\n private _loop = false;\r\n private _round = false;\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 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.play,\r\n pause: this.pause,\r\n stop: this.stop,\r\n seekbackward: this.seekBackward,\r\n seekforward: this.seekForward,\r\n seekto: this.seekTo,\r\n previoustrack: this.previous,\r\n nexttrack: this.next\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, loop, round} = this;\r\n return {\r\n volume, \r\n muted, \r\n playbackRate,\r\n loop,\r\n round\r\n };\r\n }\r\n \r\n public seekBackward = (details: MediaSessionActionDetails) => {\r\n const 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) => {\r\n const 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) => {\r\n const 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 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 && attribute.title || doc.file_name;\r\n artist = attribute && 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 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 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 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 current = this.listLoader.getCurrent();\r\n if(!current || !verify(current)) {\r\n const previous = this.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 = this.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 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),\r\n message,\r\n media: playingMedia,\r\n playbackParams: this.getPlaybackParams()\r\n };\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 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 if(this.lockedSwitchers || \r\n (!this.round && this.listLoader.current && !this.listLoader.next.length) || \r\n !this.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 toggle(play?: boolean) {\r\n if(!this.playingMedia) {\r\n return false;\r\n }\r\n\r\n if(play === undefined) {\r\n play = this.playingMedia.paused;\r\n }\r\n\r\n if(this.playingMedia.paused !== play) {\r\n return false;\r\n }\r\n\r\n if(play) {\r\n this.playingMedia.play();\r\n } else {\r\n this.playingMedia.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 = () => {\r\n const 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 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 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 if(this.lockedSwitchers) {\r\n return;\r\n }\r\n\r\n if(this.playingMediaType === 'audio') {\r\n return this.listLoader.goRound(length, dispatchJump);\r\n } else {\r\n return this.listLoader.go(length, dispatchJump);\r\n }\r\n };\r\n\r\n public next = () => {\r\n return this.go(1);\r\n };\r\n\r\n public previous = () => {\r\n const media = this.playingMedia;\r\n // if(media && (media.currentTime > 5 || !this.listLoader.getPrevious().length)) {\r\n if(media && media.currentTime > 5) {\r\n media.currentTime = 0;\r\n this.toggle(true);\r\n return;\r\n }\r\n\r\n return this.go(-1);\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 if(!this.listLoader) {\r\n 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 this.listLoader.reset();\r\n }\r\n\r\n const reverse = this.searchContext.folderId !== undefined ? false : true;\r\n if(prev) {\r\n this.listLoader.setTargets(prev, next, reverse);\r\n } else {\r\n this.listLoader.reverse = reverse;\r\n }\r\n\r\n this.listLoader.setSearchContext(this.searchContext);\r\n this.listLoader.current = current;\r\n\r\n this.listLoader.load(true);\r\n this.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 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 () => {\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(media && this.playingMedia === media) {\r\n this.stop();\r\n }\r\n\r\n if(wasPlaying) {\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\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\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 cancelEvent from \"../helpers/dom/cancelEvent\";\nimport { AttachClickOptions, attachClickEvent, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\nimport ripple from \"./ripple\";\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 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 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","/*\n * 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","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\nimport appMediaPlaybackController from \"../components/appMediaPlaybackController\";\nimport { IS_APPLE_MOBILE } from \"../environment/userAgent\";\nimport { IS_TOUCH_SUPPORTED } from \"../environment/touchSupport\";\nimport RangeSelector from \"../components/rangeSelector\";\nimport { onMediaLoad } from \"../helpers/files\";\nimport cancelEvent from \"../helpers/dom/cancelEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport ButtonMenu from \"../components/buttonMenu\";\nimport { ButtonMenuToggleHandler } from \"../components/buttonMenuToggle\";\nimport rootScope from \"./rootScope\";\nimport { GrabEvent } from \"../helpers/dom/attachGrabListeners\";\nimport { attachClickEvent } from \"../helpers/dom/clickEvent\";\nimport ControlsHover from \"../helpers/dom/controlsHover\";\nimport { addFullScreenListener, cancelFullScreen, isFullScreen, requestFullScreen } from \"../helpers/dom/fullScreen\";\nimport toHHMMSS from \"../helpers/string/toHHMMSS\";\n\nexport 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\nexport 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 private 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\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\n /* protected videoParent: HTMLElement;\n protected videoWhichChild: number; */\n\n protected onPlaybackRackMenuToggle?: (open: boolean) => void;\n\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle}: {\n video: HTMLVideoElement, \n play?: boolean, \n streamable?: boolean, \n duration?: number,\n onPlaybackRackMenuToggle?: (open: boolean) => void\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\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 \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(!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) { // 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 /* player.addEventListener('click', (e) => {\n if(e.target !== player) {\n return;\n }\n\n this.togglePlay();\n }); */\n \n /* video.addEventListener('play', () => {\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 \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 removeListeners() {\n super.cleanup();\n this.listenerSetter.removeAll();\n this.progress.removeListeners();\n this.onPlaybackRackMenuToggle = undefined;\n }\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","/*\n * 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","/*\n * 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 { MediaProgressLine } from \"../lib/mediaPlayer\";\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\";\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 if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(doc.audioPerformer) {\n parts.push(htmlToSpan(doc.audioPerformer));\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 middleEllipsisEl.innerHTML = doc.audioTitle || doc.fileName;\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: HTMLImageElement[] = [];\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,\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\";\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,\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) p.innerHTML = 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 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: string, row: Row) => {\n //fastRaf(() => {\n row.title.innerHTML = 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(`div[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 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\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 title.innerHTML = poll.poll.rQuestion;\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 answerTitle.innerHTML = 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\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 textEl.innerHTML = 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
${RichTextProcessor.wrapEmojiText(answer.text)}
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
${poll.rQuestion}
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\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","/*\r\n * https://github.com/morethanwords/tweb\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\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 = document.createElement('video');\r\n video.classList.add('media-video');\r\n video.setAttribute('playsinline', 'true');\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[] = [];\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.fileName || '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.innerHTML = 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;\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 return blur(cacheContext.url, 12).then(url => {\r\n return renderOnLoad(url);\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(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');\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 div.innerHTML = `\r\n \r\n `;\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 = document.createElement('video');\r\n media.setAttribute('playsinline', 'true');\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 = document.createElement('video');\r\n media.setAttribute('playsinline', 'true');\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 messageDiv.innerHTML = 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","/*\r\n * https://github.com/morethanwords/tweb\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\";\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 if(type === 'inputMessagesFilterEmpty') return messages;\n\n if(type !== 'inputMessagesFilterUrl') {\n messages = messages.filter(message => !!message.media);\n }\n\n /* if(!this.peerId) {\n messages = messages.filter(message => {\n if(message.peerId === rootScope.myId) {\n return true;\n }\n\n const dialog = appMessagesManager.getDialogByPeerId(message.fromId)[0];\n return dialog && dialog.folder_id === 0;\n });\n } */\n\n let filtered: any[] = [];\n\n switch(type) {\n case 'inputMessagesFilterPhotoVideo': {\n for(let message of messages) {\n let media = message.media.photo || message.media.document || (message.media.webpage && message.media.webpage.document);\n if(!media) {\n //this.log('no media!', message);\n continue;\n }\n \n if(media._ === 'document' && media.type !== 'video'/* && media.type !== 'gif' */) {\n //this.log('broken video', media);\n continue;\n }\n\n filtered.push(message);\n }\n \n break;\n }\n\n case 'inputMessagesFilterDocument': {\n for(let message of messages) {\n if(!message.media.document || ['voice', 'audio', 'gif', 'sticker', 'round'].includes(message.media.document.type)) {\n continue;\n }\n \n filtered.push(message);\n }\n break;\n }\n\n case 'inputMessagesFilterUrl': {\n //this.log('inputMessagesFilterUrl', messages);\n for(let message of messages) {\n //if((message.media.webpage && message.media.webpage._ !== 'webPageEmpty')) {\n filtered.push(message);\n //}\n }\n \n break;\n }\n\n case 'inputMessagesFilterMusic': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'audio') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterVoice': {\n for(let message of messages) {\n if(!message.media.document || message.media.document.type !== 'voice') {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n case 'inputMessagesFilterRoundVoice': {\n for(let message of messages) {\n if(!message.media.document || !(['voice', 'round'] as MyDocument['type'][]).includes(message.media.document.type)) {\n continue;\n }\n\n filtered.push(message);\n }\n\n break;\n }\n\n default:\n break;\n }\n\n return filtered;\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 webpage.rDescription = RichTextProcessor.wrapRichText(limitSymbols(message.message, 150, 180));\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 previewDiv.innerHTML = RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true);\n }\n \n let title = webpage.rTitle || '';\n let subtitle = webpage.rDescription || '';\n\n const subtitleFragment = htmlToDocumentFragment(subtitle);\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) {\n //title = new URL(webpage.url).hostname;\n title = 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 { 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, { PrivacySectionStr } from \"../../../privacySection\";\r\nimport { i18n, LangPackKey } from \"../../../../lib/langPack\";\r\nimport anchorCopy from \"../../../../helpers/dom/anchorCopy\";\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 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: '+380509144504'\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 { 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 passwordInputField.label.innerHTML = 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 blur(cacheContext.url, 12, 4)\r\n .then(url => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(url);\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\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 this.h6.innerHTML = 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\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 span.innerHTML = 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\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 = 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 const peers = filter[key].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\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') this.onEditOpen();\r\n else this.onCreateOpen();\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 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 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 if(!IS_MOBILE_SAFARI && !appNavigationController.findItemByType('global-search')) {\n appNavigationController.pushItem({\n onPop: () => {\n close();\n },\n type: 'global-search'\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 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 span.innerHTML = RichTextProcessor.wrapEmojiText(postAuthor) + ',' + 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: string;\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.innerHTML = 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: 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 titleDiv.innerHTML = 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\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
${RichTextProcessor.wrapEmojiText(set.title)}
\r\n `;\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 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 title.innerHTML = 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 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 } 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\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 ) {\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 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 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 fromUp = maxBubbleId > 0 && (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 = this.getMountedBubble(lastMsgId);\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 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\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 attachmentDiv.innerHTML = 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 buttonEl.insertAdjacentHTML('beforeend', text);\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 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 });\r\n preview.append(docDiv);\r\n preview.classList.add('preview-with-document');\r\n //messageDiv.classList.add((webpage.type || 'document') + '-message');\r\n //doc = null;\r\n }\r\n }\r\n \r\n let quoteTextDiv = document.createElement('div');\r\n quoteTextDiv.classList.add('quote-text');\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 if(webpage.rTitle) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, webpage.rTitle);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n if(webpage.rDescription) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, webpage.rDescription);\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 texts = [];\r\n if(contact.first_name) texts.push(RichTextProcessor.wrapEmojiText(contact.first_name));\r\n if(contact.last_name) texts.push(RichTextProcessor.wrapEmojiText(contact.last_name));\r\n\r\n contactDiv.innerHTML = `\r\n
\r\n
${texts.join(' ')}
\r\n
${contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number'}
\r\n
`;\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 title.innerHTML = 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 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 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\r\n const className = 'has-sticky-dates';\r\n const state = scrollSaver.getSaved();\r\n const isLoading = !this.preloader.detached;\r\n const hasScroll = state.scrollHeight !== state.clientHeight;\r\n if((hasScroll || isLoading) && !this.bubblesContainer.classList.contains(className)) {\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 } else {\r\n this.willScrollOnLoad = undefined;\r\n }\r\n }\r\n\r\n return true;\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","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 = 28;\nconst PADDING = 4;\nconst 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 private container: HTMLElement;\n private reactionsMap: Map;\n private 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 } 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} = initResult;\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 openBtnMenu(element, () => {\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\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 if(this.message._ === 'message' && !this.chat.selection.isSelecting && !this.message.pFlags.is_outgoing && !this.message.pFlags.is_scheduled) {\r\n const position: 'horizontal' | 'vertical' = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.appReactionsManager, position, this.middleware);\r\n reactionsMenu.init(this.appMessagesManager.getGroupsFirstMessage(this.message));\r\n element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 42;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n if(position === 'vertical') {\r\n menuPadding = {\r\n top: 24,\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: 36,\r\n left: 24\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 },\r\n menuPadding\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 RichTextProcessor from \"../../lib/richtextprocessor\";\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\";\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 = document.createElement('video');\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 video.setAttribute('playsinline', '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 fileName: file.name ? RichTextProcessor.wrapEmojiText(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 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 name.innerHTML = 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 description.innerHTML = 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\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 btn.innerHTML = 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\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 preview.innerHTML = 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 title.innerHTML = RichTextProcessor.wrapEmojiText(item.title);\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n description.innerHTML = 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 btnSwitchToPM.insertAdjacentHTML('beforeend', 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\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-32', '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 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'),\r\n link: href ? () => document.execCommand('createLink', false, href) : () => document.execCommand('unlink', false, null),\r\n spoiler: () => document.execCommand('fontName', false, 'spoiler')\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(document.execCommand('fontName', false, 'Roboto'));\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 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 } 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 = 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 = 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 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 { MediaProgressLine, VolumeSelector } from \"../../lib/mediaPlayer\";\nimport ButtonIcon from \"../buttonIcon\";\nimport { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport { Message } from \"../../layer\";\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}: {\n doc: MyDocument,\n message: Message.message,\n media: HTMLMediaElement\n }) => {\n let title: string | HTMLElement, 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 title = doc.audioTitle || doc.fileName;\n subtitle = doc.audioPerformer || i18n('AudioUnknownArtist');\n }\n\n this.fasterEl.classList.toggle('hide', isMusic);\n this.repeatEl.classList.toggle('hide', !isMusic);\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 && !!Object.keys(this.chat.bubbles.bubbles).length\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);\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 { 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 { MediaSize } from \"../../helpers/mediaSizes\";\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.innerHTML = 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, 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';\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();\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 = /* window.location.origin + window.location.pathname + */'assets/img/' + theme.background.slug + '.svg';\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 // setTimeout(() => {\n this.applyCurrentTheme();\n // }, 0);\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 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) {\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.setBackground('', 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'),\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 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 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 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\";\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\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 appNavigationController.removeByType('media');\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 any).cleanup && (this.listLoader as any).cleanup();\n this.setMoverPromise = null;\n this.tempId = -1;\n (window as any).appMediaViewer = undefined;\n\n if(this.zoomSwipeHandler) {\n this.zoomSwipeHandler.removeListeners();\n this.zoomSwipeHandler = 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 window.removeEventListener('keydown', this.onKeyDown);\n window.removeEventListener('keyup', this.onKeyUp);\n window.removeEventListener('wheel', this.onWheel, {capture: true});\n\n promise.finally(() => {\n this.wholeDiv.remove();\n rootScope.isOverlayActive = false;\n animationIntersector.checkAnimations(false);\n });\n\n return promise;\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 = document.createElement('video');\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.wholeDiv.classList.add('backwards');\n setTimeout(() => {\n this.wholeDiv.classList.remove('active');\n }, 0);\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 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.innerHTML = 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 rootScope.isOverlayActive = true;\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 const mainColumns = document.getElementById('main-columns');\n this.pageEl.insertBefore(this.wholeDiv, mainColumns);\n void this.wholeDiv.offsetLeft; // reflow\n this.wholeDiv.classList.add('active');\n animationIntersector.checkAnimations(true);\n\n if(!IS_MOBILE_SAFARI) {\n appNavigationController.pushItem({\n type: 'media',\n onPop: (canAnimate) => {\n if(this.setMoverAnimationPromise) {\n return false;\n }\n \n this.close();\n }\n });\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;\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 */document.createElement('video');\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 });\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.removeListeners();\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 const rollback = appMediaPlaybackController.setSingleMedia(video, message as Message.message);\n\n this.addEventListener('setMoverBefore', () => {\n rollback();\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 = '';\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\";\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.unshiftItem(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 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 elements.title.innerHTML = 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 titleSpan.innerHTML = 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/11.9d6292221b761a8e5ba9.chunk.js b/public/11.9d6292221b761a8e5ba9.chunk.js new file mode 100644 index 00000000..5e79ef84 --- /dev/null +++ b/public/11.9d6292221b761a8e5ba9.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[11],{106:function(e,t,s){"use strict";s.d(t,"a",(function(){return a}));var i=s(32),n=s(64);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)}}},116: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()}}},129:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(69);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()}}},130:function(e,t,s){"use strict";s.d(t,"a",(function(){return n}));var i=s(64);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})}}},151:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(117),n=s(118),a=s(2),o=s(64);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})}}},181:function(e,t,s){"use strict";s.r(t),s.d(t,"AppDialogsManager",(function(){return Ac}));var i=s(63),n=s(73),a=s(0),o=s(62),r=s(70),l=s(56),c=s(32),d=s(125),h=s(175),p=s(188);const u=[...h.a].concat([...p.a]);var g=new Set(u);function m(e,t){e.setAttribute("dir","auto"),e.innerHTML=t}var b=s(61),v=s(97),f=s(80);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 L 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 L(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 C=s(82),M=s(79),I=s(34),E=s(59),P=s(65),k=s(58),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(64);class _{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 F=s(137),j=s(84),D=s(15),R=s(81),B=s(57);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(74);class K{constructor(e){this.historyTabIds=[],this.canHideFirst=!1,this.onCloseBtnClick=()=>{j.a.findItemByType(this.navigationType)?j.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(F.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)),j.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||j.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(66),W=s(148);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 $=(e={})=>Object(B.a)("btn-circle btn-corner z-depth-1"+(e.className?" "+e.className:""),e);class Q 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 Vn({}),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=$({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 Vn({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(27),J=s(128),Z=s(90),ee=s(60),te=s(75),se=s(28),ie=s(10),ne=s(36),ae=s(2),oe=s(69),re=s(52),le=s(1),ce=s(88),de=s(111),he=s(14),pe=s(109),ue=s(3),ge=s(40),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=C.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),C.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;return me(this,void 0,void 0,(function*(){if(document.pictureInPictureElement)return;yield Object(pe.e)(t,void 0,!1);const n=i.a.getMediaFromMessage(e),a=[],l="voice"===n.type||"round"===n.type;let c="",h="";if(null===(s=n.thumbs)||void 0===s?void 0:s.length){const s=n.thumbs[n.thumbs.length-1];if(!s.bytes){const i=ce.a.getCacheContext(n,s.type);if(i.url)a.push({src:i.url,sizes:`${s.w}x${s.h}`,type:"image/jpeg"});else{r.a.preloadPhoto(n,s).then(()=>{this.playingMedia===t&&i.url&&this.setNewMediadata(e)})}}}else if(l){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;a.push({src:e,sizes:"160x160",type:"image/jpeg"})}else n.loadPromise.then(s=>{this.playingMedia===t&&s&&this.setNewMediadata(e)})}c=o.a.getPeerTitle(s,!0,!1),h=T.c.format("voice"===n.type?"AttachAudio":"AttachRound",!0)}if(!l){const e=n.attributes.find(e=>"documentAttributeAudio"===e._);c=e&&e.title||n.file_name,h=e&&e.performer}a.length||(ae.b?he.a?a.push({src:"assets/img/apple-touch-icon-precomposed.png",sizes:"180x180",type:"image/png"}):a.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}`;a.push({src:`assets/img/android-chrome-${t}.png`,sizes:t,type:"image/png"})}));const p=new MediaMetadata({title:c,artist:h,artwork:a});navigator.mediaSession.metadata=p}))}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 L({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();return 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),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(121),we=s(134),Se=s(39),Le=s(33),Ce=s(96),Me=s(35);function Ie(e){return function(e,t){let s,i=!1;return(...n)=>{s=n,i||(i=!0,e(()=>{i=!1,t(...s)}))}}(Me.b,e)}var Ee=s(20);function Pe(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 ke=s(112),Te=s(103);function xe(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 Ae(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 Oe{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=Ae(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(Te.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(Te.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(Te.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 _e extends Oe{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 Fe(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(Te.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(ke.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 je(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 De=(e,t)=>{let s,i;const n=!e.classList.contains("search-super-item"),a=Object(Le.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 Re 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=xe(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?Fe(this):function(e){const t=e.withTime,s=e.message,n=i.a.getMediaFromMessage(s),a="voice"===n.type||"round"===n.type,o=document.createElement("div");if(o.classList.add("audio-description"),!a){const a=[];n.audioPerformer&&a.push(Object(Ce.a)(n.audioPerformer)),t?a.push(Object(ne.d)(s.date)):a.length||a.push(Pe(n.size)),e.showSender&&a.push(i.a.wrapSenderToPeer(s)),o.append(...Object(T.g)(a," • "))}e.insertAdjacentHTML("beforeend",'\n
\n
\n
\n
');const r=e.querySelector(".audio-title"),l=new we.a;l.dataset.fontWeight=e.dataset.fontWeight,l.dataset.sizeType=e.dataset.sizeType,a?l.append(i.a.wrapSenderToPeer(s)):l.innerHTML=n.audioTitle||n.fileName,r.append(l),e.showSender&&r.append(i.a.wrapSentTime(s));const c=e.querySelector(".audio-subtitle");return c.append(o),()=>{let t=!1,s=new _e(e.audio,n.supportsStreaming);e.addAudioListener("ended",()=>{e.classList.remove("audio-show-progress"),c.lastChild.replaceWith(o),t=!1});const i=()=>{t||(e.classList.add("audio-show-progress"),t=!0,s&&c.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 m=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=()=>xe(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:Ee.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,s]=e?De(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=ks({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;m(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=je(!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=je(),t||(this.readyPromise=Object(ie.a)());const n=()=>{i();const n=C.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",Re);var Be=s(124);class Ne{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 Ue(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(Be.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=ic.chat.bubbles.getMiddleware();const e=ic.chat.bubbles.lazyLoadQueue;if("sticker"===(null===(s=p.document)||void 0===s?void 0:s.type))u=!0,As({doc:p.document,div:c,lazyLoadQueue:e,group:ec,width:32,height:32,middleware:b,loadPromises:h});else{const t=p.photo||p.document;g="round"===t.type;try{ks({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(Be.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 He extends Ne{constructor(e){super(e,(e,t="",s)=>{this.mediaEl||(this.mediaEl=document.createElement("div"),this.mediaEl.classList.add(this.className+"-media"));const i=Ue({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 ze(e,t){return e.reduce((e,t)=>e+t,t)}const Ve=0,Ke=1,Ge=2,We=4,qe=8;class $e{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=$e.countRatios(e),this.proportions=$e.countProportions(this.ratios),this.averageRatio=ze(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:qe|Ke|Ge},{geometry:{x:0,y:t+this.spacing,width:e,height:t},sides:qe|We|Ge}]}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:Ke|qe|We},{geometry:{x:e+this.spacing,y:0,width:e,height:t},sides:Ke|Ge|We}]}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:Ke|qe|We},{geometry:{x:s+this.spacing,y:0,width:t,height:i},sides:Ke|Ge|We}]}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:Ke|qe|We},{geometry:{x:n+this.spacing,y:0,width:i,height:s},sides:Ke|Ge},{geometry:{x:n+this.spacing,y:s+this.spacing,width:i,height:t},sides:We|Ge}]}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:qe|Ke|Ge},{geometry:{x:0,y:t+this.spacing,width:s,height:i},sides:We|qe},{geometry:{x:s+this.spacing,y:t+this.spacing,width:n,height:i},sides:We|Ge}]}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:qe|Ke|Ge},{geometry:{x:0,y:t+this.spacing,width:i,height:o},sides:We|qe},{geometry:{x:i+this.spacing,y:t+this.spacing,width:a,height:o},sides:We},{geometry:{x:i+this.spacing+a+this.spacing,y:t+this.spacing,width:n,height:o},sides:Ge|We}]}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:Ke|qe|We},{geometry:{x:t+this.spacing,y:0,width:o,height:i},sides:Ke|Ge},{geometry:{x:t+this.spacing,y:i+this.spacing,width:o,height:n},sides:Ge},{geometry:{x:t+this.spacing,y:i+n+2*this.spacing,width:o,height:a},sides:We|Ge}]}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(Te.a)(e,1,2.75):Object(Te.a)(e,.6667,1))}layout(){let e=new Array(this.count),t=[];const s=(e,t)=>{const s=ze(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=ze(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=$({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 Ze(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 et{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?m(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 tt=(e,t)=>Ze(e.map(e=>({container:e.container,input:e.radioField.input})),t);function st(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 it=s(21),nt=s(44);class at{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&&(I.c.getState().then(t=>{s.checked=Object(nt.a)(t,e.stateKey)===e.value}),s.addEventListener("change",()=>{I.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 ot=document.createElement("div");function rt(e){Object(k.a)(ot,e),document.body.append(ot),ot.dataset.timeout&&clearTimeout(+ot.dataset.timeout),ot.dataset.timeout=""+setTimeout(()=>{ot.remove(),delete ot.dataset.timeout},3e3)}function lt(e){rt(Object(T.d)(e.langPackKey,e.langPackArguments))}ot.classList.add("toast");var ct=s(89),dt=s(8);class ht extends O.b{constructor(e){super(e),this.checkUsernameDebounced=Object(ct.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=dt.a.invokeApi("channels.checkUsername",{channel:G.a.getChannelInput(this.options.peerId.toChatId()),username:e}):this.checkUsernamePromise=dt.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 pt=s(71),ut=s(68);class gt extends pt.b{constructor(e,t={}){if(super("popup-peer"+(e?" "+e:""),t.buttons&&Object(pt.a)(t.buttons),Object.assign({overlayClosable:!0},t)),this.className=e,t.peerId){const e=new vc;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&&(e.innerHTML=t.description),s.append(e)}t.checkboxes&&(this.container.classList.add("have-checkbox"),t.checkboxes.forEach(e=>{e.withRipple=!1;const t=new ut.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 mt=s(76);class bt 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 Vn({name:e?"ChannelType":"GroupType"}),s=Object(it.b)(),i=new et({radioField:new at({langKey:e?"ChannelPrivate":"MegaPrivate",name:s,value:"private"}),subtitleLangKey:e?"ChannelPrivateInfo":"MegaPrivateInfo"}),o=new et({radioField:new at({langKey:e?"ChannelPublic":"MegaPublic",name:s,value:"public"}),subtitleLangKey:e?"ChannelPublicInfo":"MegaPublicInfo"}),r=tt([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 Vn({}),h=new et({title:this.chatFull.exported_invite.link,subtitleLangKey:e?"ChannelPrivateLinkHelp":"MegaPrivateLinkHelp",clickable:()=>{st(this.chatFull.exported_invite.link),rt(T.c.format("LinkCopied",!0))}}),p=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"RevokeLink"});Object(l.b)(p,()=>{new gt("revoke-link",{buttons:[{langKey:"RevokeButton",callback:()=>{const e=Object(mt.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 Vn({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 ht({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=$({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 Vn({name:"SavingContentTitle",caption:e?"RestrictSavingContentInfoChannel":"RestrictSavingContentInfoGroup"}),s=new ut.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 vt=s(83);class ft{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 yt=s(101),wt=s(104),St=s(67),Lt=s(99),Ct=s(154),Mt=s(38),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 Et{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 Vn({});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(Le.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 Vn({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(wt.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(ct.a)(this.onInput,200,!1,!0);this.input.addEventListener("input",i),this.scrollable.onScrolledBottom=()=>{this.getMoreResults()},this.scrollable.container.prepend(Gn()),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=Lt.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(Mt.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=Lt.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 ut.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 vc;return n.classList.add("selector-user-avatar","tgico","avatar-32"),n.isDialog=!0,i.dataset.key=""+e,e.isPeerId()&&(void 0===t&&(t=new St.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:yt.a.Static})})}}var Pt=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 kt extends pt.b{constructor(e){super("popup-forward",null,{closable:!0,overlayClosable:!0,body:!0}),this.selector=new Et({appendTo:this.body,onChange:()=>Pt(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 Tt extends z{init(){let e;this.container.classList.add("edit-peer-container","user-permissions-container"),this.setTitle("UserRestrictions");{const t=new Vn({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 At({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 Vn({});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(mt.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(mt.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 xt=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 At{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 ut.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=>{rt(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 Ot extends z{init(){return xt(this,void 0,void 0,(function*(){let e;this.container.classList.add("edit-peer-container","group-permissions-container"),this.setTitle("ChannelPermissions");{const t=new Vn({name:"ChannelPermissionsHeader"});e=new At({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 Vn({name:"PrivacyExceptions"}),s=new et({titleLangKey:"ChannelAddException",subtitleLangKey:"Loading",icon:"adduser",clickable:()=>{new kt({peerTypes:["channelParticipants"],onSelect:e=>{setTimeout(()=>{i(e)},0)},placeholder:"ExceptionModal.Search.Placeholder",peerId:-this.chatId})}}),i=e=>xt(this,void 0,void 0,(function*(){let t;try{t=yield n.default.getChannelParticipant(this.chatId,e)}catch(e){return void rt("User is no longer participant")}const s=new Tt(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(vt.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 ft({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 _t{constructor(e,t=o.a.getDialogType(e),s){const n=new St.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 St.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 gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}var Ft=s(100),jt=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 Dt extends z{init(){var e;return jt(this,void 0,void 0,(function*(){this.setTitle("Reactions");const t=yield Ft.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 Vn({caption:G.a.isBroadcast(this.chatId)?"EnableReactionsChannelInfo":"EnableReactionsGroupInfo"}),r=new ut.a({toggle:!0,checked:!!a.size}),l=new et({checkboxField:r,titleLangKey:"EnableReactions"});o.content.append(l.container);const c=new Vn({name:"AvailableReactions"}),d=t.map(e=>{const t=new ut.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 et({checkboxField:t,title:e.title,havePadding:!0});return _s({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(ct.a)(h,3e3,!1,!0);this.eventListener.addEventListener("destroy",h,{once:!0}),this.scrollable.append(o.container,c.container)}))}}var Rt=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 Bt extends H{_init(){var e;return Rt(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 Vn({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 Je({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 et({titleLangKey:o?"ChannelType":"GroupType",clickable:()=>{const e=new bt(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 et({titleLangKey:"Reactions",icon:"reactions",clickable:()=>{const e=new Dt(this.slider);e.chatId=this.chatId,e.open().then(()=>{this.tempId===t&&this.listenerSetter.add(e.eventListener)("destroy",a)})}}),n=(yield Ft.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 et({titleLangKey:"ChannelPermissions",clickable:()=>{const e=new Ot(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 ut.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 Vn({});if(!o&&p){const t=new ut.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 Vn({}),t=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:o?"PeerInfo.DeleteChannel":"DeleteAndExitButton"});Object(l.b)(t,()=>{new _t(h,void 0,e=>{const s=Object(mt.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 Nt=s(108);class Ut 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 Vn({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 Je({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 ut.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=!Nt.a.isMuted(e.notify_settings);t!==r.checked&&(r.checked=t)}});const l=document.createElement("div");l.classList.add("profile-name"),l.append(new St.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 et({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 St.a({peerId:this.peerId}).element]});t.content.append(s.container)}else{const e=new et({checkboxField:r}),s=!Nt.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 Vn({}),t=Object(B.a)("btn-primary btn-transparent danger",{icon:"delete",text:"PeerInfo.DeleteContact"});Object(l.b)(t,()=>{new gt("popup-delete-contact",{peerId:this.peerId,titleLangKey:"DeleteContact",descriptionLangKey:"AreYouSureDeleteContact",buttons:Object(pt.a)([{langKey:"Delete",callback:()=>{const e=Object(mt.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 Ht extends H{init(){this.container.classList.add("add-members-container"),this.nextBtn=$({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 Et({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 zt=!ae.d&&!1,Vt=s(127);function Kt(e){const t=document.createElement("span");return t.classList.add("badge-fake"),Object(T.b)(t,e?"ScamMessage":"FakeMessage"),t}function Gt(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(Kt(i.pFlags.scam)),s}const Wt=e=>e.touches?e.touches[0]:e,qt=window;let $t=!1;a.a.addEventListener("context_menu_toggle",e=>{$t=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?qt.removeEventListener("touchmove",this.handleMove,{capture:!0}):(qt.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=Wt(e);if(this.verifyTouchTarget&&!this.verifyTouchTarget(e))return this.reset();this.xDown=t.clientX,this.yDown=t.clientY,he.a?qt.addEventListener("touchmove",this.handleMove,{passive:!1,capture:!0}):qt.addEventListener("mousemove",this.handleMove,!1)},this.handleMove=e=>{if(null===this.xDown||null===this.yDown||$t)return void this.reset();this.cancelEvent&&Object(c.a)(e);const t=Wt(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),qt.addEventListener("touchend",this.reset)):(this.element.addEventListener("mousedown",this.handleStart,this.listenerOptions),qt.addEventListener("mouseup",this.reset))}removeListeners(){he.a?(this.element.removeEventListener("touchstart",this.handleStart,this.listenerOptions),qt.removeEventListener("touchend",this.reset)):(this.element.removeEventListener("mousedown",this.handleStart,this.listenerOptions),qt.removeEventListener("mouseup",this.reset))}setCursor(e){this.cursor=e,!he.a&&this.hadMove&&this.setCursorTo.style.setProperty("cursor",this.cursor,"important")}}var Yt=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.scrollable=e,this.processItem=e=>{const t=document.createElement("div");let s;t.classList.add(Xt.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=ks({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(Xt.BASE_CLASS+"-container"),this.avatars=document.createElement("div"),this.avatars.classList.add(Xt.BASE_CLASS+"-avatars"),this.gradient=document.createElement("div"),this.gradient.classList.add(Xt.BASE_CLASS+"-gradient"),this.info=document.createElement("div"),this.info.classList.add(Xt.BASE_CLASS+"-info"),this.tabs=document.createElement("div"),this.tabs.classList.add(Xt.BASE_CLASS+"-tabs"),this.arrowPrevious=document.createElement("div"),this.arrowPrevious.classList.add(Xt.BASE_CLASS+"-arrow","tgico-avatarprevious"),this.arrowNext=document.createElement("div"),this.arrowNext.classList.add(Xt.BASE_CLASS+"-arrow",Xt.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=>Yt(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,gc(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(Me.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*-Xt.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=Xt.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/Xt.SCALE))*(p>=0?1:-1);n(),this.avatars.classList.remove("no-transition"),Object(Me.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(Mt.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*Xt.SCALE*s;this.avatars.style.transform=Xt.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(Xt.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()}}Xt.BASE_CLASS="profile-avatars",Xt.SCALE=zt?2:1,Xt.TRANSLATE_TEMPLATE=zt?`translate3d({x}, 0, -1px) scale(${Xt.SCALE})`:"translate({x}, 0)";let Jt=(e,t)=>{t.title.innerHTML=e||"",t.container.style.display=e?"":"none"};class Zt{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||ic.setPeerStatus(this.peerId,this.subtitle,e,!0,()=>t===this.peerId,!this.isDialog)},zt||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 Vn({noDelimiter:!0}),this.avatar=new vc,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 et({title:" ",subtitleLangKey:"UserBio",icon:"info",clickable:e=>{"A"!==e.target.tagName&&Promise.resolve(n.default.getProfileByPeerId(this.peerId)).then(e=>{st(e.about),rt(T.c.format("BioCopied",!0))})}}),this.bio.title.classList.add("pre-wrap"),this.username=new et({title:" ",subtitleLangKey:"Username",icon:"username",clickable:()=>{st("@"+o.a.getPeer(this.peerId).username),rt(T.c.format("UsernameCopied",!0))}}),this.phone=new et({title:" ",subtitleLangKey:"Phone",icon:"phone",clickable:()=>{st("+"+E.a.getUser(this.peerId).phone),rt(T.c.format("PhoneCopied",!0))}}),this.link=new et({title:" ",subtitleLangKey:"SetUrlPlaceholder",icon:"link",clickable:()=>{st(this.link.title.textContent),rt(T.c.format("LinkCopied",!0))}}),this.location=new et({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 et({checkboxField:new ut.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=Nt.a.isPeerLocalMuted(this.peerId,!1);this.notifications.checkboxField.checked=!e}}),this.section.content.append(this.notifications.container)),this.element.append(this.section.container),zt&&this.element.append(Gn()),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 Xt(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(zt&&this.scrollable.container.classList.add("parallax"))}}zt&&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);Jt(t,this.username)}}fillUserPhone(){const{peerId:e}=this;if(e.isUser()&&this.canBeDetailed()){const t=E.a.getUser(e);Jt(t.phone?E.a.formatUserPhone(t.phone):void 0,this.phone)}}fillNotifications(){const e=this.notifications;if(e)if(this.canBeDetailed()){const t=Nt.a.isPeerLocalMuted(this.peerId,!1);e.checkboxField.checked=!t}else Object(Me.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 St.a({peerId:e,dialog:this.isDialog}).element),this.name.append(...Gt(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(Vt.a)(n.default.getProfileByPeerId(t,e),e=>{if(this.peerId!==t||this.threadId!==s||o.a.isRestricted(t))return;if(Jt(e.about?X.b.wrapRichText(e.about):void 0,this.bio),!t.isUser()){const s=G.a.getChat(t.toChatId());if(s.username)Jt("https://t.me/"+s.username,this.link);else{const t=e.exported_invite;t&&Jt(t.link,this.link)}}const i=e.location;"channelLocation"==(null==i?void 0:i._)&&Jt(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 es 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 Zt(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(F.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 Bt(this.slider):new Ut(this.slider),t&&(t instanceof Bt?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=$({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 St.a({peerId:e}).element),t}),s||(l=[{text:"AddMembersForwardMessages",checked:!0}]);else{n="AddOneMemberAlertTitle",o="AddMembersAlertNamesText";const e=document.createElement("b");e.append(new St.a({peerId:t[0]}).element),r=[e],s||(l=[{text:"AddOneMemberForwardMessages",textArgs:[new St.a({peerId:t[0]}).element],checked:!0}])}r.push(new St.a({peerId:e}).element),new gt("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&<({langPackKey:"InviteToGroupError"})};if(s){const e=new Ht(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 kt({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 ts=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 es(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=ic.selectTab(s?1:2,t);return document.body.classList.toggle("is-right-column-shown",e),n}};le.a.appSidebarRight=ts;var ss=ts;class is 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=Ye.a.getPoll(e.media.poll.id);this.setTitle(s.poll.pFlags.quiz?"PollResults.Title.Quiz":"PollResults.Title.Poll");const i=document.createElement("h3");i.innerHTML=s.poll.rQuestion;const n=s.results.results.map(e=>e.voters/s.results.total_voters*100);rs(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");c.innerHTML=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,()=>{ss.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,m=t.voters-4;const b=()=>{g||(g=!0,Ye.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&&(m-=e.votes.length,v.lastElementChild.replaceWith(Object(T.d)("PollResults.LoadMore",[Math.min(20,m)]))),p=e.next_offset,u=20,m&&e.votes.length||v.remove()}).finally(()=>{g=!1}))};if(b(),m<=0)return;const v=document.createElement("div");v.classList.add("poll-results-more","show-more","rp-overflow"),v.addEventListener("click",b),Object(te.a)(v);const f=document.createElement("div");f.classList.add("tgico-down"),v.append(f,Object(T.d)("PollResults.LoadMore",[Math.min(20,m)])),a.append(v)}),this.resultsDiv.append(i,a),ss.toggleSidebar(!0).then(()=>{}),t}}var ns=s(72);class as{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 vc,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 os=0;const rs=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",()=>{cs&&ls(cs,ds,hs)}),b.b.addEventListener("resize",()=>{ps.setMaxLength(),ps.resizePolls()}),b.b.addEventListener("changeScreen",()=>{ps.setMaxLength()});const ls=(e,t,s)=>{e.classList.remove("active"),clearTimeout(s),setTimeout(()=>{t(),e.remove(),cs===e&&ds===t&&hs===s&&(cs=ds=null,hs=0)},200)};let cs,ds,hs;class ps 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=Lt.a.width<=360?Lt.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(){os||(os=document.getElementById("poll-line").getTotalLength(),ps.setMaxLength());const e=this.message.media.poll.id,{poll:t,results:s}=Ye.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
${X.a.wrapEmojiText(e.text)}
\n \n \n
\n `).join("");if(this.innerHTML=`\n
${t.rQuestion}
\n
\n
\n
\n
\n ${a}`,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-Xe.a.serverTimeOffset);this.quizInterval=window.setInterval(()=>{const t=Date.now(),s=(l-t)/r,i=(l-t)/1e3+1|0;e.innerHTML=xe(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(()=>{Ye.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),ss.isTabExists(is)||new is(ss).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)=>{cs&&ls(cs,ds,hs);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),a.innerHTML=X.a.wrapRichText(e,{entities:t}),ic.chat.bubbles.bubblesContainer.append(i),i.offsetLeft,i.classList.add("active"),cs=i,ds=s,hs=window.setTimeout(()=>{ls(i,s,hs)},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(Le.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=Ye.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(ns.a)(this,"",!this.isRetracted,340),Object(Me.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 as({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(Me.b)(e):e()}let n;e=e.slice(),rs(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]*ps.MAX_LENGTH+", 485.9",s.style.strokeDashoffset=""+t*ps.MAX_OFFSET)}}ps.MAX_OFFSET=-46.5,ps.MAX_LENGTH=0,customElements.define("poll-element",ps);var us=s(98),gs=s(138),ms=s(78),bs=s(102),vs=s(149),fs=s(150),ys=s(45),ws=s(86),Ss=s(22),Ls=s(168);function Cs(e={}){const t=document.createElement("video");return e.pip||(t.disablePictureInPicture=!0),t.setAttribute("playsinline","true"),t}var Ms=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 Es({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 L,I;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=xe(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,_={};if("image/gif"===e.mime_type){const a=ks({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 _.thumb=a,_.loadPromise=a.loadPromises.full,_}const F=Cs();if(F.classList.add("media-video"),F.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(F),t.append(i);const p=h.getContext("2d"),u=()=>{const e=i.message,t=fe.addMedia(e,!P),s=()=>{(ic.chat.setPeerPromise||Promise.resolve()).finally(()=>{Object(bs.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(bs.a)(t)?(t.paused&&n(),x.innerText=xe(t.duration-t.currentTime,!1)):s())},o=Ie(a),r=()=>{F.classList.add("hide"),i.classList.remove("is-paused"),Object(ke.b)(n,h),O&&O.preloader&&O.preloader.classList.contains("manual")&&O.onClick()},u=()=>{Object(bs.a)(t)?i.classList.add("is-paused"):s()},g=()=>{F.classList.remove("hide"),i.classList.add("is-paused"),F.currentTime=0,x.innerText=xe(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:Ee.c,inputFilter:{_:"inputMessagesFilterEmpty"},useSearch:!1})){const[t,n]=s?De(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(),F.classList.add("hide")):u():r()};s.pFlags.is_outgoing?(i.onLoad=u,i.dataset.isOutgoing="1"):u()}else F.autoplay=!0;let j;if(s){if(j=ks({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}),_.thumb=j,!T&&"gif"!==e.type||g)return _.loadPromise=j.loadPromises.full,_;if(o){const e=(j.images.thumb||j.images.full).parentElement;F.width=+e.getAttributeNS(null,"width"),F.height=+e.getAttributeNS(null,"height"),e.append(F)}}else{const t=C.a.getThumb(e,!1);t&&t.promise.then(()=>{F.poster=t.cacheContext.url})}!F.parentElement&&t&&((null==j?void 0:j.aspecter)||t).append(F);const D=ce.a.getCacheContext(e),R=!!(null===(L=null==s?void 0:s.media)||void 0===L?void 0:L.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(F.addEventListener("error",e=>{4!==F.error.code&&console.error("Error "+F.error.code+"; details: "+F.error.message),O&&!R&&O.detach(),B.isFulfilled||B.resolve()},{once:!0}),Object(pe.e)(F).then(()=>{u&&M.a.addAnimation(F,u),O&&!R&&O.detach(),B.resolve()}),"video"===e.type){const e=Ie(()=>{F.videoWidth&&(x.innerText=xe(F.duration-F.currentTime,!1))});F.addEventListener("timeupdate",e),A&&F.addEventListener("timeupdate",()=>{gs.a.mutateElement(A,()=>{A.remove()})},{once:!0})}F.muted=!0,F.loop=!0,F.autoplay=!0;let N=P&&(null===(I=null==j?void 0:j.preloader)||void 0===I?void 0:I.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),F.addEventListener(ae.g?"timeupdate":"canplay",()=>{O.detach()},{once:!0})));else{const s=i=C.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(us.a)(F,D.url)):B.resolve()},()=>{}),{download:i,render:B}};return O&&!R&&O.setDownloadFunction(U),"gif"!==e.type||T?_.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}),_}function Ps({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 Re;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(vs.a)(w.pop().split(" ",1)[0].toLowerCase()):"file";let L=document.createElement("div");L.classList.add("document","ext-"+S),L.dataset.docId=""+f.id;const M=document.createElement("div");M.classList.add("document-ico");const I=ce.a.getCacheContext(f);if((null===(b=f.thumbs)||void 0===b?void 0:b.length)||e.pFlags.is_outgoing&&I.url&&"photo"===f.type){L.classList.add("document-with-thumb");let t=[];if(e.pFlags.is_outgoing&&["photo","video"].includes(f.type))M.innerHTML=``,t.push(M.firstElementChild);else{const e=ks({photo:f,message:null,container:M,boxWidth:54,boxHeight:54,loadPromises:d,withoutPreloader:!0,lazyLoadQueue:p,size:r.a.choosePhotoSize(f,54,54,!0)});M.style.width=M.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 M.innerText=S;let E=f.fileName||"Unknown.file";document.createElement("div").classList.add("document-description");const P=[Pe(f.size)];t&&P.push(Object(ne.d)(e.date)),o&&P.push(i.a.wrapSenderToPeer(e)),L.innerHTML=`\n ${I.downloaded&&!y||!e.mid?"":'
'}\n
\n
\n `;const k=L.querySelector(".document-name"),x=new we.a;x.dataset.fontWeight=""+s,x.dataset.sizeType=u,x.innerHTML=E,k.append(x),o&&k.append(i.a.wrapSentTime(e));if(L.querySelector(".document-size").append(...Object(T.g)(P," · ")),L.prepend(M),!y&&e.pFlags.is_outgoing&&!e.mid)return L;let A,O=null;const _=()=>{if(A){A.classList.add("downloaded");const e=A;setTimeout(()=>{e.remove()},200),A=null}O&&(O=null)},F=e=>{var t;const s=!e||e.isTrusted,i=C.a.getDoc(L.dataset.docId);let n;const o=ic.chat.bubbles?ic.chat.bubbles.lazyLoadQueue.queueId:void 0;if(s)if("pdf"===i.type){const e=C.a.downloading.has(i.id)||I.downloaded;n=C.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)?C.a.downloadDoc(i,o):C.a.saveDocFile(i,o);else n=C.a.downloadDoc(i,o);return A&&(n.then(_),O.attach(A,!0,n)),{download:n}};return C.a.downloading.has(f.id)?(A=L.querySelector(".document-download"),O=new ye.a,O.attach(A,!1,C.a.downloading.get(f.id))):I.downloaded&&!y||(A=L.querySelector(".document-download"),O=e.media.preloader,O?(O.attach(A),e.media.promise.then(_)):(O=new ye.a,O.construct(),O.setManual(),O.attach(A),O.setDownloadFunction(F),void 0!==h&&h>=f.size&&Object(l.d)(O.preloader))),Object(l.b)(L,e=>{O?O.onClick(e):F(e)}),L}function ks({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 L,M,I,E=s,P=!0,k=Promise.resolve();const T="document"===e._&&"image/gif"===e.mime_type&&!h;if(M=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,I=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,I,!m,!0);if(i){k=i.loadPromise;const e=i.image;e.classList.add("media-photo"),s.append(e)}else{ks({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)),I=ce.a.getCacheContext(e,null==h?void 0:h.type);if(!v){const t=r.a.getStrippedThumbIfNeeded(e,I,!m);t&&(k=Promise.all([k,t.loadPromise]),L=t.image,L.classList.add("media-photo"),E.append(L))}M.classList.add("media-photo");const x=(L||!I.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):I.downloaded||(A=new ye.a({attachMethod:"prepend"}));const O=e=>Ts(s,M,e,x,E,L),_=()=>d&&!d()?Promise.resolve():y?Object(fs.a)(I.url,12).then(e=>O(e)):O(I.url);let F;const j=h.w>=150&&h.h>=150||S,D=()=>{S&&!p&&A&&(A.construct(),A.setManual());const t=T&&!h?C.a.downloadDoc(e,null==c?void 0:c.queueId):r.a.preloadPhoto(e,h,null==c?void 0:c.queueId,S);A&&!I.downloaded&&!p&&j&&A.attach(s,!1,t),S=void 0;const i=t.then(_);return i.catch(()=>{}),{download:t,render:i}};return A&&A.setDownloadFunction(D),I.downloaded?k=F=D().render:c?c.push({div:s,load:()=>D().download}):F=D().render,u&&k&&u.push(k),{loadPromises:{thumb:k,full:F||Promise.resolve()},images:{thumb:L,full:M},preloader:A,aspecter:E}}function Ts(e,t,s,i,n=e,a){return i&&t.classList.add("fade-in"),new Promise(o=>{Object(us.a)(t,s,()=>{gs.a.mutateElement(e,()=>{n.append(t),Object(Me.b)(()=>{o()}),i&&t.addEventListener("animationend",()=>{gs.a.mutate(()=>{t.classList.remove("fade-in"),a&&a.remove()})},{once:!0})})})})}function xs({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=As({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(ws.a)(e),e.addEventListener("enterFrame",t=>{t===e.maxFrame&&(e.remove(),r.remove(),ic.chat.bubbles.scrollable.container.removeEventListener("scroll",g))}),Ls.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(bs.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 ic.chat.bubbles.scrollable.container.addEventListener("scroll",g),u(),ic.emojiAnimationContainer.append(r),{animationDiv:r,stickerPromise:l}}function As({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:L}){var I;const E=e.sticker;if(1===E&&(L=!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"),L&&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=!L&&(2===E||3===E),A=x;let O=Object(ie.a)(),_=!1;if(((null===(I=e.thumbs)||void 0===I?void 0:I.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"),gs.a.mutateElement(t,()=>{t.append(i),O.resolve()}))};if("url"in a)i=new Image,Object(us.a)(i,a.url,o),_=!0;else if("bytes"in a){if("photoPathSize"===a._)if(a.bytes.length){const s=r.a.getPathFromPhotoPathSize(a);t.innerHTML=`\n \n `}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,ys.a||e.pFlags.stickerThumbConverted||P.url?(Object(us.a)(i,r.a.getPreviewURLFromThumb(e,a,!0),o),_=!0):re.a.convert(""+e.id,a.bytes).then(n=>{a.bytes=n,e.pFlags.stickerThumbConverted=!0,s&&!s()||t.childElementCount||Object(us.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(us.a)(i,P.url,o)};return P.url?(n(),Promise.resolve()):C.a.getThumbURL(e,a).promise.then(n)};if(n&&h)return n.push({div:t,load:r}),Promise.resolve();r(),a.url&&(_=!0)}}if(f&&_&&f.push(O),h)return Promise.resolve();const F=()=>Ms(this,void 0,void 0,(function*(){if(!s||s()){if(2===E&&!L)return yield C.a.downloadDoc(e,null==n?void 0:n.queueId).then(n=>Ms(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?gs.a.mutate(()=>{r.canvas.classList.add("fade-in"),s&&s.classList.add("fade-out"),r.canvas.addEventListener("animationend",()=>{gs.a.mutate(()=>{r.canvas.classList.remove("fade-in"),i()})},{once:!0})}):s&&gs.a.mutate(i),!1!==m&&C.a.saveLottiePreview(e,r.canvas,k)},{once:!0}),p){const e={a:[],v:1};let n;ms.a.preloadAnimatedEmojiStickerAnimation(p),Object(l.b)(t,a=>Ms(this,void 0,void 0,(function*(){Object(c.a)(a);const o=oe.a.getAnimation(t);if(o.paused){const e=ms.a.getAnimatedEmojiSoundDocument(p);if(e){const s=document.createElement("audio");s.style.display="none",t.parentElement.append(s);try{yield C.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(!ic.chat.peerId.isUser())return;const r=ms.a.getAnimatedEmojiSticker(p,!0);if(!r)return;const l=Object(Le.a)(t,"bubble"),d=l.classList.contains("is-out"),{animationDiv:h}=xs({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(Ss.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(Le.a)(t,"bubble");i.a.setTyping(ic.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(L||3===E){let i;L?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||(L?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=()=>{gs.a.mutateElement(t,()=>{if(t.append(i),l&&l.classList.add("fade-out"),3===E&&!C.a.isSavingLottiePreview(e,k)){Object(ws.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),C.a.saveLottiePreview(e,t,k)}3===E&&o&&M.a.addAnimation(i,o),a(),y&&i.addEventListener("animationend",()=>{i.classList.remove("fade-in"),l&&l.remove()},{once:!0})})};L?Object(us.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&&L){const s=r.a.choosePhotoSize(e,u,g,!1);t=C.a.getThumbURL(e,s).promise}else t=C.a.downloadDoc(e,null==n?void 0:n.queueId);t.then(d,a)}})}}})),j=!n||T&&!x?F():(n.push({div:t,load:F}),Promise.resolve());return T&&L&&(O=j,f&&f.push(O)),j}function Os({set:e,lazyLoadQueue:t,container:s,group:i,autoplay:n,width:a,height:o}){var r;return Ms(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=ms.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(us.a)(t,URL.createObjectURL(e),()=>{s.append(t)})})}}});const l=ms.a.getStickerSet(e),c=yield l;"documentEmpty"!==c.documents[0]._&&As({doc:c.documents[0],div:s,group:i,lazyLoadQueue:t})}))}function _s({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=As({div:n,doc:e,width:o,height:o,loadPromises:a});return a&&Promise.all(a).then(()=>{n.classList.remove("hide"),i.remove()}),r}function Fs(e,t,s){const i=new He("reply");return i.fill(e,t,s),i.container}function js(e){const t=new $e(e.items,e.maxWidth,e.minWidth,e.spacing,e.maxHeight).layout(),s=t.find(e=>e.sides&Ge),i=s.geometry.width+s.geometry.x,n=t.find(e=>e.sides&We),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&qe&&s&Ke&&(l.style.borderTopLeftRadius="inherit"),s&qe&&s&We&&(l.style.borderBottomLeftRadius="inherit"),s&Ge&&s&Ke&&(l.style.borderTopRightRadius="inherit"),s&Ge&&s&We&&(l.style.borderBottomRightRadius="inherit"),e.forMedia){const e=document.createElement("div");e.classList.add("album-item-media"),l.append(e)}})}function Ds({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})}js({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._?ks({photo:r,message:l,container:p,boxWidth:0,boxHeight:0,isOut:o,lazyLoadQueue:a,middleware:s,size:n,loadPromises:c,autoDownloadSize:d.photo}):Es({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 Rs=s(91),Bs=s(110),Ns=s(93);function Us(e,t,s,i){return void 0===i&&(i=e.parentElement===t?Object(Ns.a)(e):-1),i!==s&&(-1!==i&&is?t.insertBefore(e,t.children[s]):t.append(e):t.prepend(e),!0)}var Hs=s(141);class zs{constructor(e){this.updateElementWith=e=>e(),this.updateListWith=e=>e(!0),this.middleware=Object(Bs.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(Hs.a)(this.sorted,s,"index");if(!t&&this.onSort){const e=this.middleware.get();(i||this.updateElementWith)(()=>{e()&&this.onSort(s,n)})}}}var Vs=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 Ks extends zs{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;Us(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:Me.b,updateListWith:e=>Vs(this,void 0,void 0,(function*(){return Object(bs.a)(this.list)?(yield Object(Rs.c)(),Object(bs.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()})},Ks.SORT_INTERVAL)};s()}}Ks.SORT_INTERVAL=3e4;var Gs=s(165);function Ws(e){let t=!1;return new Qt(Object.assign(Object.assign({},e),{verifyTouchTarget:t=>!Object(Le.a)(t.target,"progress-line")&&!Object(Gs.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 qs(e){return Ws(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 $s=s(118);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:""),Object(te.a)(o);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);!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 Ys=(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},Xs=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 Js extends kt{constructor(e,t,s=!1){super({peerTypes:["dialogs","contacts"],onSelect:s?t:s=>Xs(this,void 0,void 0,(function*(){if(t){const e=t(s);e instanceof Promise&&(yield e)}ic.setInnerPeer({peerId:s}),ic.chat.input.initMessagesForward(e)})),placeholder:"ShareModal.Search.ForwardPlaceholder",chatRightsAction:"send_messages",selfPresence:"ChatYourSelf"})}}class Zs{constructor(e,t,s,n){const r=new St.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(pt.a)(u);new gt("popup-delete-chat",{peerId:e,titleLangKey:c,titleLangArgs:d,descriptionLangKey:h,descriptionLangArgs:p,buttons:u,checkboxes:g}).show()}}var ei=s(155);class ti{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 gt("popup-delete-chat",{peerId:e,title:n,description:a,buttons:o}).show()}}var si=s(37);function ii(){window.getSelection?window.getSelection().empty?window.getSelection().empty():window.getSelection().removeAllRanges&&window.getSelection().removeAllRanges():document.selection&&document.selection.empty()}var ni=s(113);const ai=e=>[...e.values()].reduce((e,t)=>e+t.size,0);class oi 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(),ii(),e&&(this.doNotAnimate=void 0)},Object(w.a)(this,e),this.navigationType="multiselect-"+Object(it.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}),ii();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(Le.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(Le.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(bs.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=ai(i);if(this.toggleByElement&&s){n<2&&Object(ni.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||(ii(),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),ii()},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 ut.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&&ii()),Object(si.a)();const n=!!i||t;return this.onToggleSelection&&this.onToggleSelection(n,!this.doNotAnimate),ae.f||(n?j.a.pushItem({type:this.navigationType,onPop:()=>{this.cancelSelection()}}):j.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(ns.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 ai(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 rt(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 ri extends oi{constructor(e,t){super({appMessagesManager:t,listenElement:e.container,listenerSetter:new R.a,verifyTarget:(e,t)=>!!t&&this.isSelecting,getElementFromTarget:e=>Object(Le.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(ns.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(ns.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 Js(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 Zs(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 li extends oi{constructor(e,t,s,i){super({appMessagesManager:i,listenElement:t.bubblesContainer,listenerSetter:t.listenerSetter,getElementFromTarget:e=>Object(Le.a)(e,"grouped-item")||Object(Le.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(Le.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(ns.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 ti(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 Js(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 Zs(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 ci=s(146),di=s(180),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 Js({[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 Zs(this.peerId,[this.mid],"chat")};const s=e=>{let s;this.init&&(this.init(),this.init=null);try{s=Object(Le.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=Ys(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(Bs.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 ri(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&&qs({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(Le.a)(e.target,"search-super-item")))},{capture:!0,passive:!1});const o=(e,t,s,n)=>{const a=Object(Le.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(Le.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 lc).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(Rs.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._?Es({doc:a,message:e,container:o,boxWidth:0,boxHeight:0,lazyLoadQueue:this.lazyLoadQueue,middleware:s,onlyPreview:!0,withoutPreloader:!0,noPlayButton:!0,size:c}).thumb:ks({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=Ps({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,o.rDescription=X.b.wrapRichText(Object(Be.a)(e.message,150,180)))}let l=document.createElement("div");if(l.classList.add("preview","row-media"),o.photo){ks({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"),l.innerHTML=X.b.getAbbreviation(o.title||o.display_url||o.description||o.url,!0);let c=o.rTitle||"",d=o.rDescription||"";const h=Object(ei.a)(d),p=Object(ei.a)(X.b.wrapRichText(o.url||"")).firstElementChild;if(p instanceof HTMLAnchorElement)try{p.innerText=decodeURIComponent(p.href)}catch(e){}h.firstChild&&h.append("\n"),h.append(p),this.showSender&&h.append("\n",i.a.wrapSenderToPeer(e)),c||(c=X.b.wrapPlainText(o.display_url.split("/",1)[0]));const u=new et({title:c,titleRight:i.a.wrapSentTime(e),subtitle:h,havePadding:!0,clickable:!0,noRipple:!0});u.container.append(l),u.container.innerText.trim().length&&n.push({element:u.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(Rs.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(di.a)(s)}|${Object(di.a)(Object(vs.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($s.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)=>I.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 Ks({lazyLoadQueue:this.lazyLoadQueue,rippleEnabled:!1}),Object(l.b)(this.membersList.list,e=>{const t=Object(vt.a)(e.target,"LI");if(!t)return;const s=t.dataset.peerId.toPeerId();let i=Promise.resolve();b.b.isMobile&&(i=ss.toggleSidebar(!1)),i.then(()=>{ic.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*(Lt.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(ci.a)(a,"desc");let d=0;for(;dc[d])break}a[n]={container:e,items:l},Us(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=Ys(s,e.listenerSetter);return r.classList.add(t),gi(o,i,e,n),o.append(r),o},vi=s(77),fi=s(169);!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 dt.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]=dt.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 Vn({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(it.b)();t.forEach(({type:e,langKey:t})=>{const i=new et({radioField:new at({langKey:t,name:s,value:""+e})});this.radioRows.set(e,i)});const i=tt([...this.radioRows.values()],this.onRadioChange);if(this.radioSection.content.append(i),e.appendTo&&e.appendTo.append(this.radioSection.container),!e.noExceptions){const t=Kn(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 et(s),s.row.container.addEventListener("click",()=>{n.then(()=>{const t=this.peerIds[s.key];new Ht(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 Li extends z{init(){this.header.classList.add("with-border"),this.container.classList.add("privacy-tab","privacy-phone-number"),this.setTitle("PrivacyPhone");const e=document.createElement("div");e.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),st(t.href),lt({langPackKey:"LinkCopied"})}),t}({mePath:"+380509144504"}));const t=new Si({tab:this,title:"PrivacyPhoneTitle",inputKey:"inputPrivacyKeyPhoneNumber",captions:[e,e,""],exceptionTexts:["PrivacySettingsController.NeverShare","PrivacySettingsController.AlwaysShare"],appendTo:this.scrollable,onRadioChange:e=>{s.setRadio(mi.Everybody),s.radioSection.container.classList.toggle("hide",e!==mi.Nobody)}}),s=new Si({tab:this,title:"PrivacyPhoneTitle2",inputKey:"inputPrivacyKeyAddedByPhone",captions:["PrivacyPhoneInfo3","PrivacyPhoneInfo3",""],noExceptions:!0,skipTypes:[mi.Nobody]});this.scrollable.container.insertBefore(s.radioSection.container,t.radioSection.container.nextSibling)}}var Ci=s(92);class Mi extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-set"),this.setTitle("TwoStepVerificationPasswordSet");const e=new Vn({caption:"TwoStepVerificationPasswordSetInfo",noDelimiter:!0}),t=ms.a.getAnimatedEmojiSticker("🥳"),s=document.createElement("div");t?As({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 Ii=s(130);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 Vn({caption:!0,noDelimiter:!0});Object(T.b)(e.caption,"TwoStepAuth.ConfirmEmailCodeDesc",[this.email]);const t=ms.a.getAnimatedEmojiSticker("📬"),s=document.createElement("div");t?As({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 Ii.a({name:"recovery-email-code",label:"TwoStepAuth.RecoveryCode",length:this.length,onFill:e=>{d(!0),Ci.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 Mi(this.slider).open()},d=e=>{Object(mt.a)([a.input,o,r],e)};Object(l.b)(o,e=>{d(!0),Ci.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);Ci.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 Vn({caption:!0,noDelimiter:!0}),t=ms.a.getAnimatedEmojiSticker("💌"),s=document.createElement("div");t?As({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 Mi(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);Ci.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 gt("popup-skip-email",{buttons:[{langKey:"Cancel",isCancel:!0},{langKey:"YourEmailSkip",callback:()=>{p(!0),Object(ee.f)(r),Ci.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(119),xi=s(106),Ai=s(129);class Oi extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-hint"),this.setTitle("TwoStepAuth.SetupHintTitle");const e=new Vn({noDelimiter:!0}),t=ms.a.getAnimatedEmojiSticker("💡"),s=document.createElement("div");t?As({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 rt(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 _i 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 Vn({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 Fi 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 Vn({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 _i(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)),Ci.a.getState().then(e=>{this.state=e,this.state.hint?i.label.innerHTML=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;Ci.a.check(i.value,this.state).then(t=>{if(console.log(t),"auth.authorization"===t._){clearInterval(e),n&&n.remove();const t=new ji(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 ji extends H{init(){this.container.classList.add("two-step-verification","two-step-verification-main"),this.setTitle("TwoStepVerificationTitle");const e=new Vn({caption:!0,noDelimiter:!0}),t=ms.a.getAnimatedEmojiSticker("🔐"),s=document.createElement("div");t?As({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 Fi(this.slider);e.state=this.state,e.plainPassword=this.plainPassword,e.open()}),Object(l.b)(s,()=>{new gt("popup-disable-password",{buttons:[{langKey:"Disable",callback:()=>{Ci.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 Fi(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 et({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 Vn({name:"CurrentSession",caption:"ClearOtherSessionsHelp"}),a=Object(Mt.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 gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{const t=Object(mt.a)([e],!0);dt.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 Vn({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&&rt(T.c.format("RecentSessions.Error.FreshReset",!0))};let n;const a=()=>{const e=n.dataset.hash;new gt("revoke-session",{buttons:[{langKey:"Terminate",isDanger:!0,callback:()=>{dt.a.invokeApi("account.resetAuthorization",{hash:e}).then(e=>{e&&n.remove()},i)}}],titleLangKey:"AreYouSureSessionTitle",descriptionLangKey:"TerminateSessionText"}).show()},o=this.menuElement=Ys([{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(Le.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(Le.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 Vn({caption:"BlockedUsersInfo"});e.caption.parentElement.prepend(e.caption),this.scrollable.append(e.container);const t=$({icon:"add",className:"is-visible"});this.content.append(t),Object(l.b)(t,e=>{new kt({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=Ys([{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(vt.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(131);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 Vn({noDelimiter:!0,caption:"SessionsInfo"});let t;const s=new et({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 et({icon:"lock",titleLangKey:"TwoStepVerification",subtitleLangKey:"Loading",clickable:e=>{let t;i.pFlags.has_password?t=new Fi(this.slider):i.email_unconfirmed_pattern?(t=new Pi(this.slider),t.email=i.email_unconfirmed_pattern,t.length=6,t.isFirst=!0,Ci.a.resendPasswordEmail()):t=new ji(this.slider),t.state=i,t.open()}});n.freezed=!0;const o=this.activeSessionsRow=new et({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(),Ci.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 Vn({name:"PrivacyTitle",caption:"GroupsAndChannelsHelp"});e.content.classList.add("privacy-navigation-container");const t={},s=t.inputPrivacyKeyPhoneNumber=new et({titleLangKey:"PrivacyPhoneTitle",subtitleLangKey:"Loading",clickable:()=>{new Li(this.slider).open()}}),i=t.inputPrivacyKeyStatusTimestamp=new et({titleLangKey:"LastSeenTitle",subtitleLangKey:"Loading",clickable:()=>{new Di(this.slider).open()}}),n=t.inputPrivacyKeyProfilePhoto=new et({titleLangKey:"PrivacyProfilePhotoTitle",subtitleLangKey:"Loading",clickable:()=>{new Ri(this.slider).open()}}),o=t.inputPrivacyKeyPhoneCall=new et({titleLangKey:"WhoCanCallMe",subtitleLangKey:"Loading",clickable:()=>{new Ui(this.slider).open()}}),r=t.inputPrivacyKeyForwards=new et({titleLangKey:"PrivacyForwardsTitle",subtitleLangKey:"Loading",clickable:()=>{new Bi(this.slider).open()}}),l=t.inputPrivacyKeyChatInvite=new et({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 Vn({name:"Privacy.SensitiveContent"});t.container.classList.add("hide"),e.push(dt.a.invokeApi("account.getContentSettings").then(e=>{if(!e.pFlags.sensitive_can_change)return;const s=e.pFlags.sensitive_enabled,i=new et({checkboxField:new ut.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&&dt.a.invokeApi("account.setContentSettings",{sensitive_enabled:e})},{once:!0})})),this.scrollable.append(t.container)}{const e=new Vn({name:"FilterChats"}),t=()=>{new gt("popup-delete-drafts",{buttons:[{langKey:"Delete",callback:()=>{const e=Object(mt.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(){dt.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 Qi(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 $i(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(ke.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(){Ae(this.elements.box,()=>{this.onGrabStart(),this.boxRect=this.elements.box.getBoundingClientRect()},e=>{this.saturationHandler(e.x,e.y)},()=>{this.onGrabEnd()})}attachHueListeners(){Ae(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=Qi(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=$i(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(Te.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(Te.a)(e-this.boxRect.left,0,i)/i*100,o=Object(Te.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(Te.a)(a,0,100),c=100-l/2,d=100-Object(Te.a)(o,0,100),h=Object(Te.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=Qi(e),s=this.theme.background,i=Zi(t);s.id="2",s.intensity=0,s.slug="",s.color=e.toLowerCase(),s.highlightningColor=i,I.c.pushToState("settings",a.a.settings),ic.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 Vn({});this.colorPicker=new tn,e.content.append(this.colorPicker.container),this.scrollable.append(e.container);const t=new Vn({}),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(Le.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(Ss.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=C.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=>{dt.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=C.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=I.b.settings.themes.find(e=>e.name===this.theme.name);e&&(++this.tempId,this.theme.background=Object(ue.a)(e.background),I.c.pushToState("settings",a.a.settings),ic.applyCurrentTheme(void 0,void 0,!0),this.blurCheckboxField.setValueSilently(this.theme.background.blur))},this.onGridClick=e=>{const t=Object(Le.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=C.a.downloadDoc(i,ic.chat.bubbles?ic.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(us.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,I.c.pushToState("settings",a.a.settings),h&&this.saveToCache(h,i),ic.applyCurrentTheme(h,i,!0).then(n.resolve)})};if(!i)return void o();const r=ce.a.getCacheContext(i);t.blur?setTimeout(()=>{Object(fs.a)(r.url,12,4).then(e=>{s()?o(e):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=Kn(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 ut.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,I.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),dt.a.invokeApiHashable({method:"account.getWallPapers"}).then(e=>{e.wallpapers.forEach(e=>{this.addWallPaper(e)})});const e=Kn(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=C.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=ks({photo:o,message:null,container:d,withoutPreloader:!0,size:p,noFadeIn:e.pFlags.pattern}),(h.loadPromises.thumb||h.loadPromises.full).then(()=>{gs.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 pt.b{constructor(e){super("popup-stickers",null,{closable:!0,overlayClosable:!0,body:!0}),this.stickerSetInput=e,this.onStickersClick=e=>{const t=Object(Le.a)(e.target,"sticker-set-sticker");if(!t)return;const s=t.dataset.docId;ic.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",()=>{M.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 ms.a.getStickerSet(this.stickerSetInput).then(e=>{if(!e)return lt({langPackKey:"StickerSet.DontExist"}),void this.hide();let t;this.set=e.set,M.a.setOnlyOnePlayableGroup("STICKERS-POPUP"),this.h6.innerHTML=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(mt.a)([t],!0);ms.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;As({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(29);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([Ft.a.getQuickReaction(),Ft.a.getAvailableReactions()]).then(([e,t])=>{t=t.filter(e=>!e.pFlags.inactive);const s=new Vn,i=t.map(t=>{const s=new at({name:"quick-reaction",text:t.title,value:t.reaction,alignRight:!0}),i=new et({radioField:s,havePadding:!0});return s.main.classList.add("quick-reaction-title"),_s({row:i,doc:t.static_icon,size:"small"}),t===e&&s.setValueSilently(!0),i}),n=tt(i,e=>{Ft.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 Oe({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=Kn.bind(null,this.scrollable);{const t=e("Settings"),s=new pn("TextSize",1,a.a.settings.messagesTextSize,12,20);s.onChange=e=>{I.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 ut.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 et({radioField:new at({langKey:"General.SendShortcut.Enter",name:i,value:"enter",stateKey:n}),subtitleLangKey:"General.SendShortcut.NewLine.ShiftEnter"}),o=new et({radioField:new at({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 et({radioField:new at({langKey:"DistanceUnitsKilometers",name:i,value:"kilometers",stateKey:n})}),o=new et({radioField:new at({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 et({radioField:new at({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 ut.a({text:"GeneralSettings.EmojiPrediction",name:"suggest-emoji",stateKey:"settings.emoji.suggest",withRipple:!0}),i=new ut.a({text:"GeneralSettings.BigEmoji",name:"emoji-big",stateKey:"settings.emoji.big",withRipple:!0});t.append(s.label,i.label)}{const e=new Vn({name:"Telegram.InstalledStickerPacksController",caption:"StickersBotInfo"}),t=new et({titleLangKey:"DoubleTapSetting",havePadding:!0,clickable:()=>{new hn(this.slider).open()}}),s=()=>{Promise.resolve(Ft.a.getQuickReaction()).then(e=>{_s({row:t,doc:e.static_icon,size:"small"})})};s(),this.listenerSetter.add(a.a)("quick_reaction",s);const i=new ut.a({text:"Stickers.SuggestStickers",name:"suggest",stateKey:"settings.stickers.suggest",withRipple:!0}),n=new ut.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 et({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"),Os({set:e,container:i,group:"GENERAL-SETTINGS",lazyLoadQueue:l,width:48,height:48,autoplay:!0}),s.container.append(i),r[t](s.container)};ms.a.getAllStickers().then(e=>{Object(ws.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=Kn(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 Je({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 Vn({name:"EditAccount.Username",caption:!0}),s=document.createElement("div");s.classList.add("input-wrapper"),this.usernameInputField=new ht({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");e.innerHTML=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 ut.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 Vn({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 Et({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 rt(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()}}class fn 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 gt("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 Vn({}),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 Vn({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?rt("Sorry, you can't create more folders."):console.error("updateDialogFilter error:",e)}).finally(()=>{this.confirmBtn.removeAttribute("disabled")})):rt("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=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],i=_c.createChatList(),n=e[t].slice(),a=e=>{for(let t=0,s=Math.min(n.length,e);ta(20)),o.append(Object(T.d)("FilterShowMoreChats",[n.length])),e.append(o)}a(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.onEditOpen():this.onCreateOpen()})}}var yn=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 wn 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 et({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 fn(this.slider).open(i.a.filtersStorage.getFilter(e))},{listenerSetter:this.listenerSetter}),this.filtersRendered[n.id]=s}return a=s.container,n.hasOwnProperty("orderIndex")?Us(a,a.parentElement||t,n.orderIndex):t&&t.append(a),a}init(){return yn(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 Vn({name:"Filters"}),this.foldersSection.container.style.display="none",this.suggestedSection=new Vn({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?rt("Sorry, you can't create more folders."):new fn(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;Us(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 dt.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 rt("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 Sn 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 Vn({name:e.name}),s=new et({checkboxField:new ut.a({text:e.typeText,checked:!0}),subtitleLangKey:"Loading"}),i=new et({checkboxField:new ut.a({text:"MessagePreview",checked:!0}),subtitleLangKey:"Loading"});t.content.append(s.container,i.container),this.scrollable.append(t.container);const n={_:e.inputKey},o=Nt.a.getNotifySettings(n);(o instanceof Promise?o:Promise.resolve(o)).then(t=>{const o=()=>{const e=Nt.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===Nt.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,Nt.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 Vn({name:"NotificationsOther"}),t=new et({checkboxField:new ut.a({text:"ContactJoined",checked:!0}),subtitleLangKey:"Loading"}),s=new et({checkboxField:new ut.a({text:"Notifications.Sound",checked:!0,stateKey:"settings.notifications.sound"}),subtitleLangKey:"Loading"});I.c.getState().then(e=>{s.checkboxField.checked=e.settings.notifications.sound}),e.content.append(t.container,s.container),this.scrollable.append(e.container),Nt.a.getContactSignUpNotification().then(e=>{t.checkboxField.checked=e,this.eventListener.addEventListener("destroy",()=>{const s=t.checkboxField.checked;e!==s&&Nt.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 Cn 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 Vn({}),t=new Map,s=dt.a.invokeApiCacheable("langpack.getLanguages",{lang_pack:"macos"}).then(s=>{const i=Object(it.b)();s.forEach(e=>{const s=new et({radioField:new at({text:e.name,name:i,value:e.lang_code}),subtitle:e.native_name});t.set(e.lang_code,s)});const n=tt([...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(pt.a)([i]);a.find(e=>e.isCancel).callback=()=>{s()},e.buttons=a,e.checkboxes=n&&[n],new gt("popup-confirmation",e).show()})}function In(e,t){const s=new Vn({name:t}),i="settings.autoDownload."+e+".",n=new ut.a({text:"AutodownloadContacts",name:"contacts",stateKey:i+"contacts",withRipple:!0}),a=new ut.a({text:"AutodownloadPrivateChats",name:"private",stateKey:i+"private",withRipple:!0}),o=new ut.a({text:"AutodownloadGroupChats",name:"groups",stateKey:i+"groups",withRipple:!0}),r=new ut.a({text:"AutodownloadChannels",name:"channels",stateKey:i+"channels",withRipple:!0});return s.content.append(n.label,a.label,o.label,r.label),s}class En extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadPhotos");const e=In("photo","AutoDownloadPhotosTitle");this.scrollable.append(e.container)}}class Pn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadFiles");const e=Object(ct.a)(e=>{I.c.setByKey("settings.autoDownloadNew.file_size_max",e)},200,!1,!0),t=In("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:[Pe(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:[Pe(s)]}),e(s)},o.valueContainer.append(n.element),t.content.append(o.container),this.scrollable.append(t.container)}}class kn extends z{init(){this.header.classList.add("with-border"),this.setTitle("AutoDownloadVideos");const e=In("video","AutoDownloadVideosTitle");this.scrollable.append(e.container)}}var Tn=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 xn={contacts:"AutoDownloadContacts",private:"AutoDownloadPm",groups:"AutoDownloadGroups",channels:"AutoDownloadChannels"};class An extends z{init(){return Tn(this,void 0,void 0,(function*(){this.header.classList.add("with-border"),this.setTitle("DataSettings");{const e=new Vn({name:"AutomaticMediaDownload",caption:"AutoDownloadAudioInfo"}),t=yield I.c.getState(),s=new ut.a({text:"AutoDownloadMedia",name:"auto",checked:!t.settings.autoDownloadNew.pFlags.disabled,withRipple:!0}),i=()=>{Object(mt.a)([h],Object(ge.a)(t.settings.autoDownload,I.b.settings.autoDownload)&&Object(ge.a)(t.settings.autoDownloadNew,I.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 et({titleLangKey:"AutoDownloadPhotos",subtitle:"",clickable:()=>{o(En)}}),c=new et({titleLangKey:"AutoDownloadVideos",subtitle:"",clickable:()=>{o(kn)}}),d=new et({titleLangKey:"AutoDownloadFiles",subtitle:"",clickable:()=>{o(Pn)}}),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)(I.b.settings.autoDownloadNew),a.a.settings.autoDownload=Object(ue.a)(I.b.settings.autoDownload),I.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)}),I.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 Vn({name:"AutoplayMedia"}),t=new ut.a({text:"AutoplayGIF",name:"gifs",stateKey:"settings.autoPlay.gifs",withRipple:!0}),s=new ut.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]?xn[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(Pe(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 On=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 gt("logout",{titleLangKey:"LogOut",descriptionLangKey:"LogOut.Description",buttons:[{langKey:"LogOut",callback:()=>{dt.a.logOut()},isDanger:!0}]}).show()}}]);this.buttons.edit=N("edit"),this.header.append(this.buttons.edit,e),this.profile=new Zt(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",Sn],["data","DataSettings",An],["lock","AccountSettings.PrivacyAndSecurity",Gi],["settings","Telegram.GeneralSettingsViewController",un],["folder","AccountSettings.Filters",wn]].map(([e,t,s])=>new et({titleLangKey:t,icon:e,clickable:()=>{new s(this.slider,!0).open()}}));o.push(this.devicesRow=new et({titleLangKey:"Devices",titleRightSecondary:" ",icon:"activesessions",clickable:()=>On(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 et({titleLangKey:"AccountSettings.Language",titleRightSecondary:Object(T.d)("LanguageName"),icon:"language",clickable:()=>{new Cn(this.slider).open()}})),i.append(...o.map(e=>e.container));const r=new Vn;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=dt.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 Vn({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=$({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 Ht(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 jn=s(151);class Dn extends pt.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&&(lt({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 jn.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($s.a)(o.phone);r.code&&(n.value="+"+r.code.country_code);const c=new Je({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 Rn extends H{init(){this.container.id="contacts-container";const e=$({icon:"add",className:"is-visible"});this.content.append(e),Object(l.b)(e,()=>{new Dn},{listenerSetter:this.listenerSetter}),this.inputSearch=new _("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(Bs.a)()}createList(){const e=new Ks,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=Lt.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 Bn extends H{init(){if(this.container.id="chats-archived-container",this.setTitle("ArchivedChats"),!_c.sortedLists[Bn.filterId]){const e=_c.createChatList();_c.generateScrollable(e,Bn.filterId).container.append(e),_c.setListClickListener(e,null,!0)}const e=_c.scrollables[Bn.filterId];this.scrollable.container.replaceWith(e.container),this.scrollable=e}onOpen(){this.init&&(this.init(),this.init=null),this.wasFilterId=_c.filterId,_c.setFilterId(Bn.filterId),_c.onTabChange()}onOpenAfterTimeout(){_c.sortedLists[this.wasFilterId].clear()}onClose(){_c.setFilterId(this.wasFilterId),_c.onTabChange()}onCloseAfterTimeout(){return _c.sortedLists[Bn.filterId].clear(),super.onCloseAfterTimeout()}}Bn.filterId=1;class Nn 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=$({icon:"check"});const e=ms.a.getAnimatedEmojiSticker("🧭"),t=document.createElement("div");t.classList.add("sticker-container"),e?As({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 Ks({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 Wn({name:"PeopleNearbyHeader",sortedList:i()}),o=this.chatsSection=new Wn({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 Q(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,rt("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,rt("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 Un=s(5),Hn=s(6);function zn(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 Vn{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(Gn()),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 Kn=(e,t,s)=>{const i=new Vn({name:t,caption:s});return e.append(i.container),i.content},Gn=()=>{const e=document.createElement("div");return e.classList.add("gradient-delimiter"),e};class Wn extends Vn{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 _("Search");const e=this.sidebarEl.querySelector(".item-main .sidebar-header");e.append(this.inputSearch.container);const t=()=>{new Rn(this).open()};this.backBtn=this.sidebarEl.querySelector(".sidebar-back-button");const s={icon:"archive",text:"ArchivedChats",onClick:()=>{new Bn(this).open()},verify:()=>!!i.a.dialogsStorage.getFolderDialogs(1,!1).length||!i.a.dialogsStorage.isDialogsLoaded(1)},n=new ut.a({toggle:!0,checked:"night"===a.a.getTheme().name});n.input.addEventListener("change",()=>{a.a.settings.theme=n.input.checked?"night":"day",I.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(()=>{ic.setPeer({peerId:ic.myId})},0)}},s,{icon:"user",text:"Contacts",onClick:t},dn?{icon:"group",text:"PeopleNearby",onClick:()=>{new Nn(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 ut.a({toggle:!0,checked:!0,stateKey:"settings.animationsEnabled"})},{icon:"help",text:"TelegramFeatures",onClick:()=>{const e=T.c.format("TelegramFeaturesUrl",!0);ic.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([Hn.a.set({kz_version:"Z"}),Hn.a.delete("tgme_sync")]).then(()=>{location.href="https://web.telegram.org/z/"})},verify:()=>Un.a.isMainDomain},{icon:"char w",text:"ChatList.Menu.SwitchTo.Webogram",onClick:()=>{Hn.a.delete("tgme_sync").then(()=>{location.href="https://web.telegram.org/?legacy=1"})},verify:()=>Un.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"+Un.a.suffix+" "+Un.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 Ht(this).open({type:"chat",skippable:!1,takeOut:e=>{new Q(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=""+zn(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};j.a.pushItem(h),I.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!==Un.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(Le.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 vc;return i.classList.add("selector-user-avatar","tgico","avatar-30"),i.isDialog=!0,s.dataset.key=""+e,e.isPeerId()?(void 0===t&&(t=new St.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(vt.a)(e.target,"LI");if(!t)return;const s=Object(Le.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();I.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),I.c.pushToState("recentSearch",t);for(const e of t)I.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(F.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||j.a.findItemByType("global-search")||j.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),j.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(()=>{I.c.getState().then(e=>{this.searchGroups.recent.clear();const t=e.recentSearch||[];for(const e of t)I.c.releaseSinglePeer(e,"recentSearch");t.length=0,I.c.pushToState("recentSearch",t)})})})}};le.a.appSidebarLeft=qn;var $n=qn;class Qn{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(Mt.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 Yn extends pt.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 Jn 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=Ft.a.getReaction(s.reaction);Object(Vt.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=As({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=zn(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 as({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(ns.a)(this,"is-chosen",e,this.isConnected?300:0)}fireAroundAnimation(){Object(Vt.a)(Ft.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([As({div:s,doc:e.center_icon,width:t,height:t,withThumb:!1,needUpscale:!0,play:!1,skipRatio:1,group:"none",needFadeIn:!1}),xs({doc:e.around_animation,size:80,target:this.stickerContainer,side:"center",skipRatio:1,play:!1}).stickerPromise]).then(([e,t])=>{const i=()=>{Object(Me.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",Jn);const Zn=new Map;class ea extends HTMLElement{constructor(){super(),this.classList.add("reactions"),this.sorted=[]}connectedCallback(){let e=Zn.get(this.key);e||Zn.set(this.key,e=new Set),e.add(this),this.onConnectCallback&&this.isConnected&&(this.onConnectCallback(),this.onConnectCallback=void 0)}disconnectedCallback(){const e=Zn.get(this.key);e.delete(this),e.size||Zn.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=Ft.a.getAvailableReactions(),n=s?i instanceof Promise?t.results:t.results.filter(e=>Ft.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 Jn,n.init(this.type)),Us(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",ea);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 ta 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 as({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)?zn(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",ta);const sa=()=>{const e=document.createElement("i");return e.classList.add("edited"),Object(T.b)(e,"EditedMessage"),e},ia=()=>Object(T.d)("SponsoredMessage");var na,aa;(aa=na||(na={})).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=zn(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");t.innerHTML=X.b.wrapEmojiText(e)+", ",o.push(t)}}if(n.edit_date&&"scheduled"!==s&&!n.pFlags.edit_hide&&o.unshift(r=sa()),"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 ea,c.init(d,"inline",!0),c.render(),o.unshift(c))}else h&&o.push(l=ia());g&&o.push(g);let m=h?void 0:Object(ne.g)(a);p&&(m+=(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 b=document.createElement("span");b.classList.add("time","tgico"),b.append(...o);const v=document.createElement("div");v.classList.add("inner","tgico"),m&&(v.title=m);let f=o;if(r&&(f[f.indexOf(r)]=sa()),l&&(f[f.indexOf(l)]=ia()),c){const e=f[f.indexOf(c)]=new ea;e.init(d,"inline"),e.render()}return f=f.map(e=>e instanceof HTMLElement&&!e.classList.contains("i18n")&&!e.classList.contains("reactions")?e.cloneNode(!0):e),g&&(f[f.length-1]=Object(ne.f)(a)),v.append(...f),b.append(v),b},aa.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 ta;return r.message=s,r.type=o?"footer":"beside",r.loadPromises=n,r.lazyLoadQueue=a,r.init(),t.prepend(r),o},aa.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 St.a({peerId:l.fromId||l.fwdFromId,dialog:!1,onlyFirstName:!1,plainText:!1}).element;const c=Fs(r,void 0,l);a?a.replaceWith(c):s.append(c),t.classList.add("is-reply")};var oa=s(147);function ra(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 la(e){e.style.display="none",e.offsetLeft,e.style.display=""}le.a.getElementByPoint=ra;var ca=s(16),da=s(19),ha=s(48),pa=s(133),ua=s(11);const ga={keywords:{},version:0,langCode:Un.a.langPackCode};class ma{constructor(){this.keywordLangPacks={},this.indexedLangPacks={},this.getKeywordsPromises={}}getEmojiKeywords(e=Un.a.langPackCode){const t=this.getKeywordsPromises[e];if(t)return t;const s="emojiKeywords_"+e;return this.getKeywordsPromises[e]=ua.a.get(s).then(t=>(Object(da.a)(t)||(t={}),Object(ha.a)(ga,t),t.langCode=e,this.keywordLangPacks[e]=t,dt.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!==Un.a.langPackCode&&e.push(this.getEmojiKeywords(T.c.lastRequestedLangCode)),this.recent||e.push(this.getRecentEmojis()),Promise.all(e)}indexEmojis(){this.index||(this.index=new pa.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(ma.POPULAR_EMOJI).slice(0,36);return t=Array.from(new Set(t)),t}getRecentEmojis(){return this.getRecentEmojisPromise?this.getRecentEmojisPromise:this.getRecentEmojisPromise=I.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),I.c.pushToState("recentEmoji",t),a.a.dispatchEvent("emoji_recent",e)})}}ma.POPULAR_EMOJI=["😂","😘","❤️","😍","😊","😁","👍","☺️","😔","😄","😭","💋","😒","😳","😜","🙈","😉","😃","😢","😝","😱","😡","😏","😞","😅","😚","🙊","😌","😀","😋","😆","👌","😐","😕"];const ba=new ma;le.a&&(le.a.appEmojiManager=ba);var va=ba,fa=s(23),ya=s(26);const wa=new Set;function Sa(e,t,s=!1,i=!1){var n;const o=document.createElement("span");let r;if(o.classList.add("super-emoji"),i&&!fa.a?r=X.a.wrapSingleEmoji(e):(e=X.a.fixEmoji(e),r=X.a.wrapEmojiText(e)),o.innerHTML=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(!wa.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(Me.b)(()=>{a.a.settings.animationsEnabled&&(e.style.opacity="",s.style.opacity=""),o.classList.remove("empty"),wa.add(t)})},{once:!0}),o.append(s)}}s?t.prepend(o):t.appendChild(o)}function La(e){return Object(Le.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 Ca{constructor(){this.closeScrollTop=0,this.onContentClick=e=>{Object(c.a)(e);const t=La(e.target);t&&(ic.chat.input.onEmojiSelected(t,!1),he.b&&Object(si.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 ya.b){const i=""+ya.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=>{Sa(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(ca.a)(200),va.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=Ha.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)Sa(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(136),Ia=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 Ea{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(()=>Ia(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(Me.a)()),!this.lazyLoadQueue.intersector.isVisible(e)&&t){t.remove(),t.src="",t.load();M.a.getAnimations(t).forEach(e=>{M.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=C.a.getDoc(t);return this.scrollPromise.then(()=>{const t=Es({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();M.a.getAnimations(t).forEach(e=>{M.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=C.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(us.a)(c,l.cacheContext.url,d):d()}}class Pa{init(){this.content=document.getElementById("content-gifs");const e=this.content.firstElementChild;e.addEventListener("click",Ha.onMediaClick);const t=new P.b(this.content,"GIFS"),s=new Ea(e,Ua,t),i=Object(ee.f)(this.content,!0);dt.a.invokeApi("messages.getSavedGifs",{hash:"0"}).then(e=>{"messages.savedGifs"===e._&&e.gifs.forEach((t,i)=>{e.gifs[i]=t=C.a.saveDoc(t),s.add(t)}),i.remove()}),Va.addLazyLoadQueueRepeat(s.lazyLoadQueue,s.processInvisibleDiv),this.init=null}onClose(){}}var ka=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 Ta{constructor(e,t){this.regularLazyLoadQueue=e,this.group=t,this.animatedDivs=new Set,this.checkAnimationContainer=(e,t)=>{M.a.getAnimations(e).forEach(e=>{t?M.a.checkAnimation(e,!1):M.a.checkAnimation(e,!0,!0)})},this.processVisibleDiv=e=>{const t=e.dataset.docId,s=C.a.getDoc(t),i=b.b.active.esgSticker.width,n=As({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=C.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)),As({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 xa{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&&(a.innerHTML=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 ka(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=ms.a.getStickerSet(e);this.categoryPush(s,X.a.wrapEmojiText(e.title),n.then(e=>e.documents),t);yield n;Os({set:e,container:i,group:Ua,lazyLoadQueue:Ha.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(Le.a)(t,"category-title")){const e=Object(wt.a)(t,"data-id");new on({id:e.dataset.id,access_hash:e.dataset.access_hash}).show()}else Ha.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()},Va.addEventListener("closed",()=>{s(!0)}),Va.addEventListener("opened",()=>{s()}),this.stickyIntersector=Ha.menuOnClick(this.menu,this.scroll,t).stickyIntersector;const i=Object(ee.f)(this.content,!0);Promise.all([ms.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"))}),ms.a.getAllStickers().then(e=>{i.remove();for(let t of e.sets)this.renderStickerSet(t)})]).finally(()=>{this.mounted=!0,s()}),this.superStickerRenderer=new Ta(Ha.lazyLoadQueue,Ua),Va.addLazyLoadQueueRepeat(this.superStickerRenderer.lazyLoadQueue,this.superStickerRenderer.processInvisibleDiv),this.init=null}pushRecentSticker(e){var t;if(ms.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 Aa=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 Oa=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 dt.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=C.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(Hs.a)(t,n,"rating"),I.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 Aa(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 dt.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&&rt(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?C.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=Oa);var _a=Oa,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 ja extends H{constructor(){super(...arguments),this.nextOffset="",this.loadedAll=!1,this.onGifsClick=e=>{const t=Object(Le.a)(e.target,"gif");if(!t)return;const s=t.dataset.docId;ic.chat.input.sendMessageWithDocument(s)?b.b.isMobile&&ss.onCloseBtnClick():console.warn("got no doc by id:",s)}}init(){this.container.id="search-gifs-container",this.inputSearch=new _("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 Ea(this.gifsDiv,"GIFS-SEARCH",this.scrollable)}onClose(){this.scrollable.onScrolledBottom=()=>{}}onCloseAfterTimeout(){return this.reset(),this.gifsDiv.innerHTML="",M.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 ss.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(Ee.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 Da extends H{init(){this.container.id="stickers-container",this.container.classList.add("chatlist-container"),this.lazyLoadQueue=new Z.d,this.inputSearch=new _("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(Le.a)(e.target,"sticker-set-sticker");if(t){const e=t.dataset.docId;return void ic.chat.input.sendMessageWithDocument(e)}const s=Object(Le.a)(e.target,"sticker-set");if(!s)return;const i=s.dataset.stickerSet,n=s.dataset.access_hash,a=Object(Le.a)(e.target,"sticker-set-button");a?(e.preventDefault(),e.cancelBubble=!0,a.setAttribute("disabled","true"),ms.a.getStickerSet({id:i,access_hash:n}).then(e=>{ms.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")})})):ms.a.getStickerSet({id:i,access_hash:n}).then(e=>{new on(e.set).show()})},{listenerSetter:this.listenerSetter})}onCloseAfterTimeout(){return this.setsDiv.innerHTML="",M.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=`\n
${X.a.wrapEmojiText(e.title)}
\n `;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 ms.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()}),M.a.checkAnimations(void 0,"STICKERS-SEARCH"),t}search(e){return e?ms.a.searchStickerSets(e,!1).then(t=>{this.inputSearch.value===e&&(t=this.filterRendered(e,t)).forEach(e=>{this.renderSet(e.set)})}):this.renderFeatured()}}var Ra=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 Ba 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(ni.a)(t,this.element)||(this.displayTimeout=window.setTimeout(()=>{this.toggle(!1)},200))},this.toggle=e=>Ra(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 Na=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 Ua="emoticons-dropdown";class Ha extends Ba{constructor(){super({element:document.getElementById("emoji-dropdown")}),this.tabId=-1,this.onSelectTabClick=e=>{this.tabId!==e&&(M.a.checkAnimations(!0,Ua),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}=ic.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(Ns.a)(r)||a&&o||this.selectTab(0,!1)},this.addEventListener("open",()=>Na(this,void 0,void 0,(function*(){he.a&&Object(si.a)()&&(yield Object(ca.a)(100)),this.element.parentElement!==ic.chat.input.chatInput&&ic.chat.input.chatInput.append(this.element),this.savedRange=this.getGoodRange(),Ha.lazyLoadQueue.lock(),M.a.lockIntersectionGroup(Ua)}))),this.addEventListener("opened",()=>{M.a.unlockIntersectionGroup(Ua),Ha.lazyLoadQueue.unlock(),Ha.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover")}),this.addEventListener("close",()=>{Ha.lazyLoadQueue.lock(),M.a.lockIntersectionGroup(Ua),M.a.checkAnimations(!0,Ua)}),this.addEventListener("closed",()=>{M.a.unlockIntersectionGroup(Ua),Ha.lazyLoadQueue.unlock(),Ha.lazyLoadQueue.refresh(),this.container.classList.remove("disable-hover"),this.savedRange=void 0})}init(){this.emojiTab=new Ca,this.stickersTab=new xa,this.gifsTab=new Pa,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(),M.a.checkAnimations(!1,Ua)}),this.searchButton=this.element.querySelector(".emoji-tabs-search"),this.searchButton.addEventListener("click",()=>{1===this.tabId?ss.isTabExists(Da)||new Da(ss).open():ss.isTabExists(ja)||new ja(ss).open()}),this.deleteBtn=this.element.querySelector(".emoji-tabs-delete"),this.deleteBtn.addEventListener("click",e=>{var t;const s=ic.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});ic.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===ic.chat.input.messageInput)return e.getRangeAt(0)}}Ha.lazyLoadQueue=new Z.d,Ha.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 Xn(t.container,(i,o)=>{if(Math.abs(n-t.container.scrollTop)<=1)return;n=-1;const r=Object(Ns.a)(o);!i&&r||(a(r),s&&(r{let s=e.target;if(s=Object(Le.a)(s,"menu-horizontal-div-item"),!s)return;const i=Object(Ns.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}},Ha.onMediaClick=(e,t=!1)=>{let s=e.target;if(s=Object(vt.a)(s,"DIV"),!s)return!1;const i=s.dataset.docId;return!!i&&(ic.chat.input.sendMessageWithDocument(i,void 0,t)?(za.container&&(za.forceClose=!0,za.container.classList.add("disable-hover"),za.toggle(!1)),!0):(console.warn("got no doc by id:",i),!1))};const za=new Ha;le.a.emoticonsDropdown=za;var Va=za;var Ka=s(187);var Ga=!("undefined"==typeof RTCPeerConnection||ae.d);var Wa=Ga;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{dt.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&<({langPackKey:"RequestToJoinSent"})})}}]),{closable:!0,overlayClosable:!0,body:!0}),this.header.remove();const s=new vc;s.classList.add("avatar-100"),s.isDialog=!1,"photo"===t.photo._?(t.photo=r.a.savePhoto(t.photo),ks({container:s,message:null,photo:t.photo,boxHeight:100,boxWidth:100,withoutPreloader:!0}),s.style.width=s.style.height=""):d.a.putPhoto(s,Ee.c,!1,t.title);const i=document.createElement("div");i.classList.add("chat-title"),i.innerHTML=X.b.wrapEmojiText(t.title);const n=t.pFlags.broadcast,o=Object(T.d)(n?"Subscribers":"Members",[Object(Qa.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 Xa{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&&la(t)}}class Ja{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(Le.a)(e.target,"bubble-content");if(t&&!this.chat.selection.isSelecting){const e=Object(Le.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(ca.a)(400)]).then(([e])=>{const t=e[0];t?As({div:s,doc:t.select_animation,width:18,height:18,needUpscale:!0,middleware:a,group:ec,withThumb:!1,needFadeIn:!1}).then(e=>{Object(ws.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(Le.a)(s,"bubble")}catch(e){}if(!i)return;if(i.classList.contains("is-date")&&Object(Le.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 Yn(new Date(+e),this.onDatePick).show();break}}return}if(!he.a&&Object(Le.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(Le.a)(s,"grouped-item")||i)}const n=Object(Le.a)(s,"contact");if(n)return void this.chat.appImManager.setInnerPeer({peerId:n.dataset.peerId.toPeerId()});const a=Object(Le.a)(s,"bubble-call");if(a)return void this.chat.appImManager.callUser(this.peerId.toUserId(),a.dataset.type);const o=Object(Le.a)(s,"spoiler");if(o){const t=Object(Le.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(ns.a)(t,s,!0,n,()=>{t.dataset.spoilerTimeout=""+window.setTimeout(()=>{Object(ns.a)(t,s,!1,n,()=>{t.classList.remove("will-change"),delete t.dataset.spoilerTimeout})},a)},r)}const r=Object(vt.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(Le.a)(s,"replies")){const e=+i.dataset.mid;if(this.peerId===Ee.d){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(Le.a)(s,"is-via");if(d){const t=d.querySelector(".peer-title");if(s===t||Object(ni.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(Le.a)(s,"peer-title")||Object(vt.a)(s,"AVATAR-ELEMENT")||Object(wt.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!==Ee.c?this.chat.appImManager.setInnerPeer({peerId:t}):rt(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(Le.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")){const t=Object(Le.a)(s,"album-item")||Object(Le.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=>lc.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(Le.a)(s,"media-container-aspecter"))return;let n=Object(Le.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 lc).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(vt.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 Js({[this.peerId]:this.appMessagesManager.getMidsByMessage(t)})}let t=!1;try{t=!!Object(Le.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 Qn(this.chat),this.preloader=new ye.a({cancelable:!1}),this.lazyLoadQueue=new Z.d,this.lazyLoadQueue.queueId=++io,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+Xe.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(Le.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(Rs.c)().then(()=>{const s=t.querySelector(".time"),i=Ps({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 Re||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(Rs.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(Me.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 Xa(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 Xa(this.scrollable,!0),t.save());const e=s.peerId+"_"+s.mid,n=Zn.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(ci.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(Rs.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,na.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;Ws({element:this.bubblesContainer,verifyTouchTarget:t=>!(this.chat.selection.isSelecting||!this.chat.canSend())&&(i=Object(Le.a)(t.target,"bubble"),i&&(Object(ns.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(ns.a)(t,e,!1,250,()=>{n.parentElement===t&&(n.classList.remove("is-visible"),n.remove())}),Object(Me.b)(()=>{if(t.style.transform="",a){const{mid:e}=t.dataset;this.chat.input.initMessageReply(+e),a=!1}})},listenerOptions:{capture:!0}})}let m;Object(l.b)(this.scrollable.container,this.onBubblesClick,{listenerSetter:this.listenerSetter}),this.listenerSetter.add(this.scrollable.container)("mousedown",e=>{const t=Object(vt.a)(e.target,"CODE");if(t)return Object(c.a)(e),st(t.textContent),void lt({langPackKey:"TextCopied"})}),le.b&&this.listenerSetter.add(this.bubblesContainer)("dblclick",e=>{const t=Object(Le.a)(e.target,"grouped-item")||Object(Le.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 Xn(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(ct.a)(this.sliceViewport.bind(this),3e3,!1,!0)),Object(Rs.a)(()=>{this.isHeavyAnimationInProgress=!0,this.lazyLoadQueue.lock(),m=this.getMiddleware()},()=>{this.isHeavyAnimationInProgress=!1,m&&m()&&(this.lazyLoadQueue.unlock(),this.lazyLoadQueue.refresh()),m=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(Rs.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(ci.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(Me.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=zn(i,1);let s=!1;a.forEach(i=>{(s||i.innerHTML!==e)&&(t||(t=new Xa(this.scrollable,!0),t.save()),s=!0,i.innerHTML=e)})}}t&&t.restore()})}),this.observer=new Ja({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(ct.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(ns.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=Lt.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=ra(this.scrollable.container,e,"center");return t&&(t=Object(Le.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(ci.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),M.a.checkAnimations(!1,ec),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(Le.a)(e,"bubble");let a;if(n&&"end"!==t&&Object(Ns.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=Lt.a.height;return t-=this.bubblesContainer.offsetTop,t-=b.b.isMobile||Lt.a.height<570?58:78,t}:void 0,fallbackToElementStartWhenCentering:a,startCallback:e=>{this.onScroll(!0,e)}});return s===yt.a.Static&&(this.scrollable.lastScrollPosition=this.scrollable.scrollTop),r}scrollToEnd(){return this.scrollToBubbleEnd(this.chatInner)}scrollToBubbleEnd(e){return Za(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 Za(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(ci.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=r&&(u||n)||l,w=b>0&&(bthis.performHistoryResult(d.mids,!0,!1,void 0)),cached:!0}:this.getHistory(t,!0,u,m);const{promise:I,cached:E}=C;E||n||(g.container.textContent="",this.chat.finishPeerChange(l,u,t,s),this.preloader.attach(this.bubblesContainer));const P=this.getMiddleware();M.a.lockGroup(ec);const T=I.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),M.a.unlockGroup(ec),M.a.checkAnimations(!1,ec),this.lazyLoadQueue.unlock(),d)g.setScrollTopSilently(d.top);else if(y){let e;if(S)g.setScrollTopSilently(99999);else if(L){const t=this.setTopPadding();t.isPaddingNeeded&&(e=t.unsetPadding),g.setScrollTopSilently(0)}const s=this.getMountedBubble(t);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:yt.a.Static),!c&&l&&this.highlightBubble(a)}e&&(i||Promise.resolve()).then(()=>{e()})}else g.setScrollTopSilently(99999);this.onScroll();const i=this.getMiddleware(),o=Promise.all([T,Object(Rs.c)()]);o.then(()=>{g.checkForTriggers(),E&&this.onRenderScrollSet()}),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(Rs.c)(),Object(ca.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(oa.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(" "),L=i.lastElementChild,L.classList.contains("bubble-content-wrapper")||(L=i.querySelector(".bubble-content-wrapper")),S=L.firstElementChild,S.innerHTML="",S.style.cssText="",L.innerHTML="",L.appendChild(S);const a=L.style.transitionDelay;L.style.cssText="",L.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(L=document.createElement("div"),L.classList.add("bubble-content-wrapper"),S=document.createElement("div"),S.classList.add("bubble-content"),(i=document.createElement("div")).classList.add("bubble"),L.appendChild(S),i.appendChild(L),!y&&!e.pFlags.out&&this.observer){(e.pFlags.unread||this.appMessagesManager.isMentionUnread(e)||void 0!==this.historyStorage.readMaxId&&this.historyStorage.readMaxId"messageEntityEmoji"===e._),t=M.length;if(e.reduce((e,t)=>e+t.length,0)===t&&e.length<=3&&I.length===e.length){if(a.a.settings.emoji.big){let t=this.appStickersManager.getAnimatedEmojiSticker(M);if(1===e.length&&!E&&t)E={_:"messageMediaDocument",document:t};else{let t=document.createElement("div");t.classList.add("attachment"),t.innerHTML=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&&m(w,P);const O=na.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 _=u&&e.reply_markup;if(_&&"replyInlineMarkup"===_._&&_.rows&&_.rows.length){const t=_.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(ei.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 Js({[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"),i.insertAdjacentHTML("beforeend",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(Le.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(Ns.a)(i),a=t[Object(Ns.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"),L.append(s)}const F=e.pFlags.is_outgoing;if(y){(e.pFlags.unread||F)&&this.unreadOut.add(e.mid);let t="";t=F?"is-sending":e.pFlags.unread||e.pFlags.is_scheduled?"is-sent":"is-read",i.classList.add(t)}F&&i.classList.add("is-outgoing");const j=u&&this.appMessagesManager.getMessageWithReplies(e),D=!!j&&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"),M||i.classList.add("is-message-empty");let s=!1;switch(E._){case"messageMediaPhoto":{const s=E.photo;M||(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"),Ds({groupId:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:y,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:C,autoDownload:this.chat.autoDownload});break}const a=!ae.a&&k&&!D&&!1;a&&i.classList.add("with-media-tail"),ks({photo:s,message:e,container:t,withTail:a,isOut:N,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),loadPromises:C,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"),Es({doc:d,container:o,message:e,boxWidth:t.width,boxHeight:t.height,lazyLoadQueue:this.lazyLoadQueue,middleware:this.getMiddleware(),isOut:N,group:ec,loadPromises:C,autoDownload:this.chat.autoDownload})}else{const t=Ps({message:e,autoDownloadSize:this.chat.autoDownload.file,lazyLoadQueue:this.lazyLoadQueue,loadPromises:C,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(ei.a)(e).firstElementChild;s.classList.add("webpage-name");const i=document.createElement("strong");m(i,X.b.wrapEmojiText(t.site_name)),s.textContent="",s.append(i),c.append(s),h=s}if(t.rTitle){let e=document.createElement("div");e.classList.add("title");const s=document.createElement("strong");m(s,t.rTitle),e.append(s),c.append(e),h=e}if(t.rDescription){let e=document.createElement("div");e.classList.add("text"),m(e,t.rDescription),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"),ks({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:C,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,As({doc:n,div:t,middleware:this.getMiddleware(),lazyLoadQueue:this.lazyLoadQueue,group:ec,play:!0,loop:!0,emoji:i.classList.contains("emoji-big")?M:void 0,withThumb:!0,loadPromises:C})}else if("video"===n.type||"gif"===n.type||"round"===n.type){const s="round"===n.type;s&&(x=!0),!s&&M||(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"),Ds({groupId:g,attachmentDiv:t,middleware:this.getMiddleware(),isOut:y,lazyLoadQueue:this.lazyLoadQueue,chat:this.chat,loadPromises:C,autoDownload:this.chat.autoDownload});else{const a=!ae.a&&!ae.b&&!s&&k&&!D&&!1;a&&i.classList.add("with-media-tail"),Es({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:ec,loadPromises:C,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=Ps({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});e.innerHTML=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:C,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(Ka.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=[];e.first_name&&n.push(X.b.wrapEmojiText(e.first_name)),e.last_name&&n.push(X.b.wrapEmojiText(e.last_name)),t.innerHTML=`\n
\n
${n.join(" ")}
\n
${e.phone_number?"+"+Object($s.a)(e.phone_number).formatted:"Unknown phone number"}
\n
`;const a=new vc;a.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:e.user_id.toPeerId()}),a.classList.add("contact-avatar","avatar-54"),t.prepend(a),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 ps;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"),t.innerHTML=X.b.wrapEmojiText(R.from_name),t.classList.add("peer-title"),i.classList.add("hidden-profile")):t=new St.a({peerId:B||e.fromId}).element,e.reply_to_mid&&e.reply_to_mid!==this.chat.threadId&&u&&na.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!==Ee.d&&!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(Kt(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 vc;t.classList.add("user-avatar","avatar-40"),t.updateWithOptions({lazyLoadQueue:this.lazyLoadQueue,peerId:(R&&(this.peerId===a.a.myId||this.peerId===Ee.d)||n?B:e.fromId)||Ee.c,peerTitle:!B&&R&&R.from_name?R.from_name:void 0,loadPromises:C}),L.append(t)}}else i.classList.add("hide-name");"pinned"===this.chat.type&&(z=`${this.chat.peerId}_${e.mid}`);if(j&&j.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!==Ee.d){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,C),D){na.renderReplies({bubble:i,bubbleContainer:S,message:j,messageDiv:w,loadPromises:C,lazyLoadQueue:this.lazyLoadQueue})&&(k=!0)}return u&&this.appendReactionsElementToBubble(i,e),k&&(i.classList.add("can-have-tail"),S.append(ao())),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 ea;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=na.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 Za(this,void 0,void 0,(function*(){let s,n;e=e.slice(),i&&e.unshift(i),this.chatInner.parentElement&&(this.messagesQueueOnRender=()=>{if(s=new Xa(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&&(la(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(oa.a.Bottom)||s.length&&!e.includes(s[0])||this.setLoaded("bottom",!0,!1),!i.isEnd(oa.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 Za(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(ci.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(Me.b)(()=>{this.setStickyDateManually(),d.forEach(e=>{e.classList.remove("zoom-fade")})}),(r.length||l.length||c.length)&&(y=Promise.all(v),Object(Rs.b)(y,Math.max(...f)+200).then(()=>{Object(Me.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(Mt.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 As({doc:e,div:a,middleware:o,lazyLoadQueue:this.lazyLoadQueue,group:ec,play:!0,loop:!0,withThumb:!0,loadPromises:t}),Object(l.b)(a,e=>{Object(c.a)(e),Ha.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 Ya(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(Me.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(ws.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 Xa(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,Lt.a.height/40|0);let c=r?20:Object.keys(this.bubbles).length>0?Math.max(35,l):l;if(void 0!==so){if(!so)return{cached:!1,promise:Promise.resolve(!0)};Object.keys(this.bubbles).length>0&&--so}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=>Za(this,void 0,void 0,(function*(){if("offsetIdOffset"in e&&e.history.isEnd(oa.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(Rs.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 ao(){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 oo{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 St.a({peerId:e}).element],checked:!0})))}Object(pt.a)(h);new gt("popup-delete-chat",{peerId:e,titleLangKey:l,descriptionLangKey:c,descriptionLangArgs:d,buttons:h,checkboxes:p}).show()}}function ro(e=window.getSelection()){if(!e||!e.rangeCount)return!0;const t=e.getRangeAt(0);return!t.toString()||!t.START_TO_END}class lo extends gt{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&<({langPackKey:"ReportSentInfo"})}))}}],body:!0});const a=document.createElement("div");As({doc:ms.a.getAnimatedEmojiSticker(lo.STICKER_EMOJI),div:a,emoji:lo.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)}}lo.STICKER_EMOJI="👮‍♀️";class co extends gt{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=ms.a.preloadAnimatedEmojiSticker(lo.STICKER_EMOJI);Object(l.b)(this.body,a=>{const o=Object(Le.a)(a.target,"btn-primary"),r=i[Object(Ns.a)(o)][1];n.then(()=>{this.hide(),new lo(e,t,r,s)})},{listenerSetter:this.listenerSetter}),this.body.style.margin="0 -1rem",this.buttonsEl.style.marginTop=".5rem",this.show()}}class ho extends gt{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 po=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 uo extends pt.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 po(this,void 0,void 0,(function*(){const e=this.appMessagesManager.getGroupsFirstMessage(this.message),t=this.appMessagesManager.canViewMessageReadParticipants(e),s=new ea,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 Vn({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 ft({scrollable:s,getPromise:()=>po(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");As({doc:Ft.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 Jn;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 go="btn-menu-reactions-reaction",mo=!ae.g;class bo{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(Le.a)(e.target,go);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"),["big"].forEach(e=>{const t=document.createElement("div");t.classList.add("btn-menu-reactions-bubble","btn-menu-reactions-bubble-"+e),n.append(t)}),this.reactionsMap=new Map,this.animationGroup="CHAT-MENU-REACTIONS-"+Date.now(),M.a.setOverrideIdleGroup(this.animationGroup,!0),he.a||n.addEventListener("mousemove",this.onMouseMove),Object(l.b)(n,e=>{const t=Object(Le.a)(e.target,go);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(Bs.a)()}init(e){this.message=e;const t=this.middleware.get(),s=this.appReactionsManager.getAvailableReactionsByMessage(e);Object(Vt.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(Me.b)(i):i()})}cleanup(){this.middleware.clean(),this.scrollable.removeListeners(),this.reactionsMap.clear(),M.a.setOverrideIdleGroup(this.animationGroup,!1),M.a.checkAnimations(!0,this.animationGroup,!0)}canUseAnimations(){return a.a.settings.animationsEnabled&&!ae.e}renderReaction(e){const t=document.createElement("div");t.classList.add(go);const s=document.createElement("div");s.classList.add(go+"-scale");const i=document.createElement("div");let n;i.classList.add(go+"-appear"),this.canUseAnimations()&&(n=document.createElement("div"),n.classList.add(go+"-select","hide"));const a={selectWrapper:n,appearWrapper:i,reaction:e.reaction};this.reactionsMap.set(t,a);const o=this.middleware.get(),r=28*(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;As(Object.assign({doc:e.appear_animation,div:i,play:!0},l)).then(e=>{Object(ws.a)(e),a.appear=e,e.addEventListener("enterFrame",o=>{e.maxFrame===o&&s.then(e=>{Object(ws.a)(e),i.classList.add("hide"),n.classList.remove("hide"),t&&(a.select=e,t=!1)},Se.a)})},Se.a);const s=As(Object.assign({doc:e.select_animation,div:n},l)).then(e=>(Object(ws.a)(e),oe.a.waitForFirstFrame(e))).catch(Se.a)}else delete l.needFadeIn,delete l.withThumb,As(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(36,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=""}mo&&(s.style.transform=n)}}class vo{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(Le.a)(e.target,"bubble-content-wrapper"),t=s?s.parentElement:Object(Le.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=!ro(),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(Le.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}=r,h=t.classList.contains("is-in")?"left":"right";Object(ee.e)(e.touches?e.touches[0]:e,i,h,d),Object(ee.d)(i,()=>{this.mid=0,this.peerId=void 0,this.target=null,this.viewerPeerId=void 0,this.canOpenReactedList=void 0,l(),setTimeout(()=>{c()},300)})},this.onSendScheduledClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionSendNowBtn):new ti(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(ro()){st((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=()=>{st(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"),rt(T.c.format(i,!0)),st(n)},this.onPinClick=()=>{new oo(this.peerId,this.mid)},this.onUnpinClick=()=>{new oo(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 Js({[this.peerId]:e})}},this.onSelectClick=()=>{this.chat.selection.toggleByElement(Object(Le.a)(this.target,"grouped-item")||Object(Le.a)(this.target,"bubble"))},this.onClearSelectionClick=()=>{this.chat.selection.cancelSelection()},this.onDeleteClick=()=>{this.chat.selection.isSelecting?Object(l.d)(this.chat.selection.selectionDeleteBtn):new Zs(this.peerId,this.isTargetAGroupedItem?[this.mid]:this.chat.getMidsByMid(this.mid),this.chat.type)},this.listenerSetter=new R.a,this.middleware=Object(Bs.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(ws.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:()=>{st(this.target.innerHTML)},verify:()=>this.isUsernameTarget,withSelection:!0},{icon:"copy",text:"Text.Context.Copy.Hashtag",onClick:()=>{st(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(Le.a)(this.target,"document")||!!Object(Le.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 co(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 uo(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 ho},verify:()=>!1,isSponsored:!0}]}init(){this.cleanup(),this.setButtons();const e=this.filterButtons(this.buttons),t=this.element=Ys(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 St.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 as({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;if("message"===this.message._&&!this.chat.selection.isSelecting&&!this.message.pFlags.is_outgoing&&!this.message.pFlags.is_scheduled){const e=ae.b||he.a?"horizontal":"vertical";n=this.reactionsMenu=new bo(this.appReactionsManager,e,this.middleware),n.init(this.appMessagesManager.getGroupsFirstMessage(this.message)),t.prepend(n.widthContainer);const s=42+8;i="vertical"===e?{top:24,left:s}:{top:s,right:36,left:24}}return this.chat.container.append(t),{element:t,cleanup:()=>{this.cleanup(),n&&n.cleanup()},destroy:()=>{t.remove()},menuPadding:i}}}var fo=s(191),yo=s.n(fo),wo=s(171);class So{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=Ys(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(94),Co=s(114);class Mo extends pt.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(vt.a)(t,"LABEL"),i=Object(Co.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(vt.a)(t,"LABEL"),i=Object(Ns.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 So({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 ut.a({text:"NewPoll.Anonymous",name:"anonymous"}),this.anonymousCheckboxField.input.checked=!0,i.append(this.anonymousCheckboxField.label)),this.multipleCheckboxField=new ut.a({text:"NewPoll.MultipleChoice",name:"multiple"}),this.quizCheckboxField=new ut.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 at({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(Ns.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 Io=s(117);function Eo(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(Io.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 So({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=[],Po=void 0}),Po=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 ut.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 ut.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 rt(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([Eo(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||"",fileName:e.name?X.b.wrapEmojiText(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=Ps({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)),js({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 xo=["ArrowUp","ArrowDown"],Ao=["ArrowLeft","ArrowRight"];function Oo({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?xo.concat(Ao):"x"===t?Ao:xo);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(yt.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(Le.a)(e,"scrollable");e.classList.add("navigable-list");const b=t=>{const s=Object(ni.a)(t.target,e);s&&h(s,!1)},v=t=>{Object(c.a)(t);const s=Object(ni.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))},L=()=>{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,L())}}else L();return w(),{attach:w,detach:S,resetTarget:L}}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}=Oo({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},j.a.pushItem(this.navigationItem)),this.addEventListener("hidden",()=>{this.resetTarget=void 0,this.attach=void 0,this.detach=void 0,e.innerHTML="",s(),this.navigationItem&&(j.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&&(j.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(ns.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=>!Ha.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(),ms.a.preloadAnimatedEmojiSticker(e),ms.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 Ta(this.lazyLoadQueue,ec)}}const jo=()=>{const e=new Date;return e.setHours(0,0,0,0),e},Do=()=>{const e=new Date;return e.setFullYear(e.getFullYear()+1),e.setDate(e.getDate()-1),e};class Ro extends Yn{constructor(e,t,s){var i;if(super((i=e).getTime()>Do().getTime()?new Date:i,t,{noButtons:!0,noTitle:!0,closable:!0,withConfirm:!0,minDate:jo(),maxDate:Do(),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 Bo=s(167),No=s(105);function Uo(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=>{Sa(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 zo extends _o{constructor(e,t,s,i){super({appendTo:e,controller:t,listType:"y",onSelect:i}),this.className=s,this.container.classList.add(zo.BASE_CLASS,s)}init(){this.list=document.createElement("div"),this.list.classList.add(zo.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=zo.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=zo.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 vc;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?n.innerHTML=X.b.wrapEmojiText(e.name):n.append(new St.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"),i.innerHTML=X.b.wrapEmojiText(e.description),s.append(i)}return s}}function Vo(e,t){const s=[].concat(e.bot_info);let i;void 0!==t&&(i=new pa.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}zo.BASE_CLASS="autocomplete-peer-helper",zo.BASE_CLASS_LIST_ELEMENT=zo.BASE_CLASS+"-list-element";class Ko extends zo{constructor(e,t,s,i,n){super(e,t,"commands-helper",e=>{const t=e.querySelector(`.${zo.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=Vo(t,e);this.render(i)}),!0}}class Go{constructor(){this.helpers=new Set,this.middleware=Object(Bs.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 Wo extends zo{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(31);class $o extends Ba{constructor(e){super({element:document.createElement("div")}),this.onBodyTouchStart=e=>{const t=e.touches[0].target;Object(ni.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(Rs.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(Le.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"),t.innerHTML=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 Qo=s(186),Yo=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 Xo 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)=>Yo(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 Ea(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"),n.innerHTML=X.b.wrapEmojiText([...e.title.trim()][0]);const s=document.createElement("div");s.classList.add("inline-helper-result-title"),s.innerHTML=X.b.wrapEmojiText(e.title);const i=document.createElement("div");i.classList.add("inline-helper-result-description"),i.innerHTML=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(Qo.a)(e).then(e=>{Ts(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(ws.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"),ks({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");i.insertAdjacentHTML("beforeend",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(ct.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 Ta(this.lazyLoadQueue,"INLINE-HELPER")}}var Jo=s(30);class Zo extends zo{constructor(e,t,s){super(e,void 0,"bot-commands",e=>{const s=e.querySelector(`.${zo.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(Vt.a)(this.appProfileManager.getProfile(e),e=>{if(!t())return;const s=Vo(e),i=50*s.length+8+24;this.container.style.setProperty("--height",i+"px"),this.render(s)});this.toggle(!1)}}class er{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(),wo.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 Ro(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}=Uo(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=dt.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 rt("Posting media content isn't allowed in this group.");this.chatInput.classList.add("is-locked"),Object(si.a)(),this.recorder.start().then(()=>{this.releaseMediaPlayback=fe.setSingleMedia(),this.recordCanceled=!1,this.setRecording(!0),wo.a.setKeepAlive(!0);const e=()=>{new gt("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(Le.a)(t.target,"chat-input")||Object(Le.a)(t.target,"popup-cancel-record")||(Object(c.a)(t),e())},{capture:!0,passive:!1}),j.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=xe(o/1e3)+","+("00"+Math.round(r/10)).slice(-2);this.recordTimeEl.innerText=l,Object(Me.b)(a)};a()}).catch(e=>{switch(e.name){case"NotAllowedError":rt("Please allow access to your microphone");break;case"NotReadableError":rt(e.message);break;default:console.error("Recorder start error:",e,e.name,e.message),rt(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 gt("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(Le.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=ao();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=$({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 ut.a({checked:!0})},s.hideSender={text:"Chat.Alert.Forward.Action.Hide1",onClick:e,checkboxField:new ut.a({checked:!1})},s.showCaption={text:"Chat.Alert.Forward.Action.ShowCaption",onClick:t,checkboxField:new ut.a({checked:!0})},s.hideCaption={text:"Chat.Alert.Forward.Action.HideCaption",onClick:t,checkboxField:new ut.a({checked:!1})},s.changePeer={text:"Chat.Alert.Forward.Action.Another",onClick:()=>{this.changeForwardRecipient()},icon:"replace"}],o=s.container=Ys(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=Ze(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 Ba({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(ns.a)(this.sendAsCloseBtn,"is-visible",e,300,void 0,s),t||Object(ns.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=$({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 Zo(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 Go,this.stickersHelper=new Fo(this.rowsWrapper,this.autocompleteHelperController),this.emojiHelper=new Ho(this.rowsWrapper,this.autocompleteHelperController,this,this.appEmojiManager),this.commandsHelper=new Ko(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.mentionsHelper=new Wo(this.rowsWrapper,this.autocompleteHelperController,this,this.chat.appProfileManager,this.chat.appUsersManager),this.inlineHelper=new Xo(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 So({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),Va.attachButtonListener(this.btnToggleEmoticons,this.listenerSetter),this.listenerSetter.add(Va)("open",this.onEmoticonsOpen),this.listenerSetter.add(Va)("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===Ee.a?this.setStartParam():this.center(!0))}));try{this.recorder=new yo.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 To(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&&(j.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"});wo.a.decode(e,!0).then(e=>{wo.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(ct.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(mt.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 oo(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(ns.a)(this.inputContainer,"is-centering",i,p),Object(ns.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")),ii(),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(Co.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(Me.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(Vt.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(ns.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 St.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()}}dt.a.invokeApi("messages.saveDefaultSendAs",{peer:this.appPeersManager.getInputPeerById(t),send_as:this.appPeersManager.getInputPeerById(e)})}:void 0,textElement:s}}),s=Ys(t);t.forEach((t,s)=>{const i=e[s],n=new vc;n.classList.add("avatar-32","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 vc;a.classList.add("new-message-send-as-avatar","avatar-30"),a.updateWithOptions({isDialog:!1,peerId:e}),Object(ns.a)(a,"is-visible",!0,n,void 0,i),s&&Object(ns.a)(s,"is-visible",!1,n,()=>{s.remove()},i),this.sendAsContainer.append(a)}getDefaultSendAs(){return Object(Vt.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(Vt.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(),Jo.a&&Object(Jo.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(Bo.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(Io.a)(this.messageInput)}),he.a&&Object(l.b)(this.messageInput,e=>{this.appImManager.selectTab(1),Va.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=No.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}=Uo(this.messageInput),o=n>=0?n:i.length,r=i.substr(0,o),l=i.substr(o),c=s?r.match(er.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=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=Uo(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(er.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()?Ee.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(ns.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(ns.a)(this.btnPreloader,"show",!1,400)})}).catch(Se.a)}}return s||delete this.messageInput.dataset.inlinePlaceholder,t!==this.inlineHelper&&this.btnPreloader&&Object(ns.a)(this.btnPreloader,"show",!1,400),t}setRecording(e){this.recording!==e&&(Object(ns.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 Js(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(Co.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 Zs(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)?(rt("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=Va.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(vt.a)(t.label,"FORM").classList.contains("hide")}isDroppingCaptions(){return!this.canToggleHideAuthor()}initMessageEditing(e){const t=this.chat.getMessage(e);let s=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 St.a({peerId:t,dialog:!1,onlyFirstName:r}).element}return r?e.split(" ")[0]:e}),{forwardElements:c}=this;Object(vt.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 St.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")&&(j.a.removeByType("input-helper"),this.chat.container.classList.remove("is-helper-active"),this.t())}t(){Object(ns.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(Me.b)(()=>{s&&Object(Io.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=Fs(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||j.a.pushItem({type:"input-helper",onPop:()=>{this.onHelperCancel()}}),void 0!==n&&this.setInputValue(n),setTimeout(()=>{this.updateSendBtn()},0),c}}er.AUTO_COMPLETE_REG_EXP=/(\s|^)((?:(?:@|^\/)\S*)|(?::|^[^:@\/])(?!.*[:@\/]).*)$/;class tr{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 sr extends Oe{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,sr.ICONS.forEach(e=>this.icon.classList.remove("tgico-"+e)),this.icon.classList.add("tgico-"+sr.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()}}sr.ICONS=["volume_off","volume_mute","volume_down","volume_up"];class ir extends tr{constructor(e,t,s){super({topbar:e,chat:t,listenerSetter:e.listenerSetter,className:"audio",divAndCaption:new Ne("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;let a,o;const r="voice"!==e.type&&"round"!==e.type;r?(a=e.audioTitle||e.fileName,o=e.audioPerformer||Object(T.d)("AudioUnknownArtist")):(a=new St.a({peerId:t.fromId,fromName:null===(n=t.fwd_from)||void 0===n?void 0:n.from_name}).element,o=Object(ne.d)(t.date)),this.fasterEl.classList.toggle("hide",r),this.repeatEl.classList.toggle("hide",!r),this.onPlaybackParams(i),this.volumeSelector.setVolume(),this.progressLine.setMedia(s),this.fill(a,o,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 sr(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 _e(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 nr;!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"}(nr||(nr={}));class ar{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=nr.ONE:2===e?s=nr.TWO:3===e?s=nr.THREE:4===e?s=nr.FOUR:e>3&&(s=nr.MORE),s},this.getMarkHeight=(e,t)=>{let s;return e<=1?s=nr.ONE:2===e?s=nr.TWO:3===e?s=nr.THREE:4===e?s=nr.FOUR:e>3&&(s=nr.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-nr.ONE-s:(e-2)*s+1*e,this.getTrackHeight=(e,t)=>e<=3?nr.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 or=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 rr{constructor(){this.rows={},this.container=document.createElement("div"),this.container.className=rr.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=rr.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)},rr.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)}}rr.DURATION=200,rr.BASE_CLASS="animated-super";class lr{constructor(e=!1){this.reverse=e,this.decimals=[],this.previousNumber=0,this.container=document.createElement("div"),this.container.className=lr.BASE_CLASS}getDecimal(e){if(this.decimals[e])return this.decimals[e];const t=document.createElement("div");t.className=lr.BASE_CLASS+"-decimal";const s=document.createElement("div");s.className=lr.BASE_CLASS+"-decimal-placeholder";const i=new rr;return i.container.className=lr.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()})},rr.DURATION))}hideLeft(e){const t=(""+e).length;this.decimals.slice(t).forEach(t=>{const s=+t.placeholder.innerText||0;t.animatedSuper.getRow(lr.EMPTY_INDEX,!0);t.animatedSuper.animate(lr.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:lr.EMPTY_INDEX;o.innerText=a.placeholder.innerText=""+s,a.animatedSuper.animate(s,r,this.reverse?ethis.previousNumber,!0)}),this.hideLeft(e),this.previousNumber=e}}lr.EMPTY_INDEX=-1,lr.BASE_CLASS="animated-counter";class cr{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 He("pinned-message");this.pinnedMessageContainer=new tr({topbar:e,chat:t,listenerSetter:this.listenerSetter,className:"message",divAndCaption:n,onClose:()=>or(this,void 0,void 0,(function*(){return i.canPinMessage(this.topbar.peerId)?new oo(this.topbar.peerId,this.pinnedMid,!0):new oo(this.topbar.peerId,0,!0),!1}))}),this.pinnedMessageBorder=new ar,n.border.replaceWith(this.pinnedMessageBorder.render(1,0)),this.animatedSubtitle=new rr,n.subtitle.append(this.animatedSubtitle.container),this.animatedMedia=new rr,this.animatedMedia.container.classList.add("pinned-message-media-container"),n.content.prepend(this.animatedMedia.container),this.animatedCounter=new lr(!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(ct.a)(()=>this._setPinnedMessage(),100,!0,!0),this.setCorrectIndexThrottled=Object(Ss.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>cr.LOAD_COUNT&&(!this.loadedBottom&&e<=cr.LOAD_OFFSET||!this.loadedTop&&this.count-1-e<=cr.LOAD_OFFSET)}getCurrentIndex(e,t=!0){return or(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:cr.LOAD_COUNT,backLimit:cr.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 or(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(Rs.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 or(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 or(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=Ue({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)}))}}cr.LOAD_COUNT=50,cr.LOAD_OFFSET=5;var dr=Ga,hr=s(42);class pr extends gt{constructor(e){super("popup-mute",{peerId:e,titleLangKey:"Notifications",buttons:[{langKey:"ChatList.Context.Mute",callback:()=>{i.a.mutePeer(e,-1===s?Ee.b:Object(hr.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 et({radioField:new at({langKey:e.langKey,name:"mute-time",value:""+e.time})}));let s;const n=tt(t,e=>{s=+e});t[t.length-1].radioField.checked=!0;const a=new Vn({noShadow:!0,noDelimiter:!0});a.content.append(n),this.body.append(a.container),this.show()}}class ur{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(!dr||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(!Wa||!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 pr(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 ir(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(Le.a)(e.target,"pinned-container");if(Object(si.a)(),t){if(Object(c.a)(e),Object(Le.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(vt.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);j.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),I.c.getState().then(t=>{if(t.chatContextMenuHintWasShown)return;const s=e.toggleByElement.bind(e);e.toggleByElement=t=>{I.c.pushToState("chatContextMenuHintWasShown",!0),rt(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(Ut)){const e=new Ut(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 kt({peerTypes:["dialogs","contacts"],onSelect:t=>new Promise((s,i)=>{new gt("",{titleLangKey:"SendMessageTitle",descriptionLangKey:"SendContactToGroupText",descriptionLangArgs:[new St.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 gt("",{peerId:this.peerId,titleLangKey:"BlockUser",descriptionLangKey:"AreYouSureBlockContact2",descriptionLangArgs:[new St.a({peerId:this.peerId}).element],buttons:[{langKey:"BlockUser",isDanger:!0,callback:()=>{this.appUsersManager.toggleBlock(this.peerId,!0).then(e=>{e&<({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&<({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 _t(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(si.a)(),t(e)},{listenerSetter:this.listenerSetter})}onCallClick(e){this.chat.appImManager.callUser(this.peerId.toUserId(),e)}constructPeerHelpers(){return this.avatarElement=new vc,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 cr(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();I.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 cr(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 cr(this,this.chat,this.appMessagesManager,this.appPeersManager);this.pinnedMessage.pinnedMessageContainer.divAndCaption.container.replaceWith(e.pinnedMessageContainer.divAndCaption.container),this.pinnedMessage.destroy(),this.pinnedMessage=e}I.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(Me.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 St.a({peerId:this.peerId,dialog:!0}).element),Object(k.a)(this.title,t),"chat"===this.chat.type&&this.title.append(...Gt(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 gr 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 _("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 Yn(new Date,this.onDatePick).show()}),i&&this.appSearch.searchInput.inputField.setValueSilently(i),ss.toggleSidebar(!0)),n}}class mr{constructor(e,t,s){this.topbar=e,this.chat=t,this.foundCount=0,this.selectedIndex=0,this.onDateClick=e=>{Object(c.a)(e),new Yn(new Date,this.chat.bubbles.onDatePick).show()},this.onResultsClick=e=>{const t=Object(vt.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 _("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()}},j.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,j.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(Ns.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 br{constructor(){this.canvases=new Set}static getInstance(e){let t=this.INSTANCES.find(t=>Object(ge.a)(t.options,e));return t||(t=new br,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(us.b)(t,e,!1).then(()=>t)}cleanup(e){this.canvases.delete(e),this.canvases.size||(Object(V.a)(br.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)))}}br.INSTANCES=[];class vr 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=Ee.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=br.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(ns.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(us.a)(i,e,a):a()});return this.setBackgroundPromise=Promise.race([Object(ca.a)(500),b])}setType(e){this.type=e,"scheduled"===this.type&&(this.getMessagesStorage=()=>this.appMessagesManager.getScheduledMessagesStorage(this.peerId))}init(){this.topbar=new ur(this,ss,this.appMessagesManager,this.appPeersManager,this.appChatsManager,this.appNotificationsManager,this.appProfileManager,this.appUsersManager,this.appGroupCallsManager),this.bubbles=new no(this,this.appMessagesManager,this.appStickersManager,this.appUsersManager,this.appInlineBotsManager,this.appPhotosManager,this.appPeersManager,this.appProfileManager,this.appDraftsManager,this.appMessagesIdsManager,this.appChatsManager,this.appReactionsManager),this.input=new er(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 li(this,this.bubbles,this.input,this.appMessagesManager),this.contextMenu=new vo(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||Ee.c;if(!e)return ss.toggleSidebar(!1),this.cleanup(!0),this.topbar.setPeer(e),this.bubbles.setPeer(e),void a.a.dispatchEvent("peer_changed",e);if(!i){const t=ss.getTab(gr);t&&t.close(),this.noForwards=this.appPeersManager.noForwards(e),this.isRestricted=this.appPeersManager.isRestricted(e),this.container.classList.toggle("no-forwards",this.noForwards),ss.sharedMediaTab.setPeer(e,this.threadId),this.input.clearHelper(),this.selection.cleanup(),this.setAutoDownloadMedia()}this.peerChanged=i,void 0===s&&this.isStartButtonNeeded()&&(s=Ee.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||(ss.sharedMediaTab.setLoadMutex(this.setPeerPromise),ss.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),ss.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===Ee.d||this.appPeersManager.isAnyGroup(this.peerId)}initSearch(e){if(this.peerId)if(b.b.isMobile)this.search?this.search.setQuery(e):this.search=new mr(this.topbar,this,e);else{let t=ss.getTab(gr);t||(t=new gr(ss)),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}}}var fr=s(174);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,j.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 No.b){const i=No.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(Te.a)(e.left,l,c)}else{const e=i.left+(i.width-o.width)/2;d=Object(Te.a)(e,l,c)}this.container.style.transform=`translate3d(${d}px, ${r}px, 0)`}show(){if(this.init&&(this.init(),this.init=null),ro())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||j.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(ro(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 Lr{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 Cr(e){e.forEach(e=>e.classList.add("no-transition")),Object(Me.a)().then(()=>{e.forEach(e=>e.classList.remove("no-transition"))})}var Mr=s(49),Ir=s(47),Er=s(135),Pr=s(126);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 _r{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 Fr{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 _r(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 jr extends Fr{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 jr{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(123);class Br extends jr{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=Fr.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 m(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 zs{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)=>{Us(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:Me.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(Le.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(Le.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(ke.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 St.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(Le.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=pt.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 St.a({peerId:this.targetPeerId}).element,descriptionLangKey:this.appChatsManager.isBroadcast(this.chatId)?"VoiceChat.RemovePeer.Confirm.Channel":"VoiceChat.RemovePeer.Confirm",descriptionLangArgs:[new St.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=Ys(this.buttons,t),this.element.classList.add("group-call-participant-menu","night"),Object(ee.a)(e.onContextElement,e=>{const t=Object(Le.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?pt.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 ft({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 $r{constructor(e){this.appendTo=e,this.peerTitle=new St.a({peerId:0})}update(e){const{peerTitle:t,appendTo:s}=this,i=e.groupCall,n=e.chatId.toPeerId(!0);i.title?m(s,X.b.wrapEmojiText(i.title)):(t.peerId!==n&&(t.peerId=n,t.update()),t.element.parentElement!==s&&s.append(t.element))}}var Qr=!!("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")?Lt.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")?Lt.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(Le.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=Lt.a.height/2-this.height/2,this.left=Lt.a.width/2-this.width/2,this.setPosition()}fixDimensions(){this.width=Object(Te.a)(this.width,this.minWidth,Lt.a.width),this.height=Object(Te.a)(this.height,this.minHeight,Lt.a.height)}fixPosition(){this.top=Object(Te.a)(this.top,0,Lt.a.height-this.height),this.left=Object(Te.a)(this.left,0,Lt.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 pt.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 gt("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&&(M.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 $r(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(Le.a)(t,"chatlist")||Object(Le.a)(t,"group-call-button")||Object(Le.a)(t,"btn-icon")||Object(Le.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",!Qr);const n=t({noRipple:!0,callback:Object(Ss.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",!Qr);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(182);!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=xe(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 jr{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 pt.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&&(M.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 vc;r.classList.add("avatar-full"),r.updateWithOptions({isBig:!0,peerId:o}),n.append(r);const c=new St.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 St.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(Le.a)(t,"call-button")||Object(Le.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)}});Qr||(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(ns.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.innerHTML=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(183),vl=s(163);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(160),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 Ll=s(189),Cl=s(158),Ml=s(143),Il=s(132);var El=s(51);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(179);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 _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];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 Fl{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 jl(){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 jl()?_l.generateOffer(e):Dl()?Fl.generateOffer(e):Ol.generateOffer(e)}static generateAnswer(e){return jl()?_l.generateAnswer(e):Dl()?Fl.generateAnswer(e):Ol.generateAnswer(e)}}var zl=s(144),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 Ll.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(Cl.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(ct.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(Ml.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(Il.c)("audio",+e.audio.ssrc),e.video?Object(Il.c)("video",i(e.video.ssrcGroups)):void 0,e.screencast?Object(Il.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 Il.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(ns.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 St.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(Ss.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 $r(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(pt.b.getPopups(rl).length)return;new rl({appGroupCallsManager:this.appGroupCallsManager,appPeersManager:this.appPeersManager,appChatsManager:this.appChatsManager}).show()}else if(this.instance instanceof Kl){if(pt.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(176),ql=s(116),$l=s(25),Ql=s(120),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=[],Wa&&(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 dt.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 dt.a.invokeCrypto("compute-dh-key",e,t,s)}))}saveCall(e){const t="phoneCallDiscarded"===e._,s=this.calls.get(e.id);return s?(Object(Ql.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:dt.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(Hs.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 dt.a.invokeApi("messages.getDhConfig",{version:0,random_length:256}).then(e=>Yl(this,void 0,void 0,(function*(){return dt.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:Ee.c,date:Object(hr.a)(!0),id:--this.tempId,participant_id:e,protocol:a.protocol,pFlags:{video:t||void 0}}),this.generateDh().then(s=>(a.dh=s,dt.a.invokeApi("phone.requestCall",{user_id:E.a.getUserInput(e),protocol:a.protocol,video:t&&i,random_id:Object(it.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($l.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 dt.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=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 ec="chat",tc=he.a?"touchstart":"mousemove";const sc=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){j.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(ct.a)(()=>{const e=this.chat.topbar;e.pinnedMessage&&e.pinnedMessage.setCorrectIndex(0),dt.a.setQueueId(this.chat.bubbles.lazyLoadQueue.queueId)},a.a.settings.animationsEnabled?250:0,!1,!0),oe.a.setLoop(a.a.settings.stickers.loop),M.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=ko();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 To(this.chat,e,i.willAttachType)}})}},vi.a.attach(T.c.lastRequestedLangCode),Nt.a.start(),this.log=Object(Y.b)("IM",Y.a.Log|Y.a.Warn|Y.a.Debug|Y.a.Error),this.backgroundPromises={},I.b.settings.themes.forEach(e=>{if(e.background.slug){const t="assets/img/"+e.background.slug+".svg";this.backgroundPromises[e.background.slug]=Promise.resolve(t)}}),this.selectTab(0),window.addEventListener("blur",()=>{M.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),M.a.checkAnimations(!1),a.a.dispatchEvent("idle",a.a.idle.isIDLE)},{once:!0})}),window.addEventListener(tc,()=>{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),j.a.onHashChange=this.onHashChange,this.setSettings(),a.a.addEventListener("settings_updated",this.setSettings),Object(Rs.a)(()=>{M.a.setOnlyOnePlayableGroup("lock"),M.a.checkAnimations(!0)},()=>{M.a.setOnlyOnePlayableGroup(""),M.a.checkAnimations(!1)}),this.applyCurrentTheme(),b.b.addEventListener("changeScreen",(e,t)=>{document.body.classList.contains("is-left-column-shown")&&document.body.classList.contains("is-right-column-shown")&&ss.toggleSidebar(!1),this.appendEmojiAnimationContainer(t)}),b.b.addEventListener("resize",()=>{const e=this.chatsContainer.getBoundingClientRect();br.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 pt.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"),Mr.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)})}),ua.a.get("chatPositions").then(e=>{ua.a.setToCache("chatPositions",e||{})}),(Wa||dr)&&(this.topbarCall=new Gl(Er.a,o.a,G.a,d.a,Jl)),Wa&&(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=>{lt({langPackKey:"VoipPeerIncompatible",langPackArguments:[new St.a({peerId:e.toPeerId()}).element]})})),Mr.a.activateInstance();const e=()=>{Ir.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 gt("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)}}),dr&&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})=>Zl(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]}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(oa.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(Io.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 Zl(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 lt({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:dt.a.invokeApi("messages.checkChatInvite",{hash:e.invite}).then(t=>{t.chat&&G.a.saveApiChat(t.chat,!0),"chatInviteAlready"!==t._&&"chatInvitePeek"!==t._?new Ya(e.invite,t).show():this.setInnerPeer({peerId:t.chat.id.toPeerId(!0)})},e=>{"INVITE_HASH_EXPIRED"===e.type&&rt(Object(T.d)("InviteExpired"))});break;case $a.VOICE_CHAT:dr&&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&<({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?lt({langPackKey:"NoUsernameFound"}):"USERNAME_INVALID"===e.type&<({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 Zl(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 St.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 Zl(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 St.a({peerId:t.interlocutorUserId.toPeerId(!1)}).element,new St.a({peerId:e}).element],button:{langKey:"OK"}}),t.isClosing||(yield t.hangUp("phoneCallDiscardReasonDisconnect")))}))}discardGroupCallConfirmation(e){return Zl(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 St.a({peerId:t.chatId.toPeerId(!0)}).element,new St.a({peerId:e}).element],button:{langKey:"OK"}}),Er.a.groupCall===t&&(yield t.hangUp()))}))}joinGroupCall(e,t){return Zl(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 lt({langPackKey:"VoiceChat.Chat.Ended"});yield Mn({descriptionLangKey:"VoiceChat.Chat.StartNew",button:{langKey:"VoiceChat.Chat.StartNew.OK"}})}}yield this.discardCurrentCall(e),(()=>{Zl(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=I.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.setBackground("",!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=ua.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(ci.a)(t.bubbles,"desc").filter(e=>!t.skippedMids.has(e)),top:e};i[s]=n,this.log("saved chat position:",n)}ua.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=ua.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&&Cr([e,this.prevTab].filter(Boolean)),this.prevTab){this.prevTab.classList.remove("active"),this.chatsSelectTabDebounced(),a.a.settings.animationsEnabled&&!1!==t&&Object(Rs.b)(Object(ca.a)(400),400);const s=Object(Ns.a)(this.prevTab);Object(Ns.a)(e)>s&&j.a.pushItem({type:"chat",onPop:e=>{this.setPeer({},e),Object(si.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)=>Zl(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=ko();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 Lr(p,{header:"Preview.Dragging.AddItems",headerArgs:[e.length],onDrop:e=>{i(e,!1),sc.log("drop",e),sc.onDocumentPaste(e,"document")}}))):((e.length||t)&&u.push(new Lr(p,{icon:"dragfiles",header:"Chat.DropTitle",subtitle:"Chat.DropAsFilesDesc",onDrop:e=>{i(e,!1),sc.log("drop",e),sc.onDocumentPaste(e,"document")}})),(s||t)&&u.push(new Lr(p,{icon:"dragmedia",header:"Chat.DropTitle",subtitle:"Chat.DropQuickDesc",onDrop:e=>{i(e,!1),sc.log("drop",e),sc.onDocumentPaste(e,"media")}})),this.chat.container.append(p))}Object(ns.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&&Cr([$n.sidebarEl,this.columnEl,ss.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(Me.a)():Promise.resolve();if(-1!==s&&s!==e&&a.a.settings.animationsEnabled&&!1!==t){const e=100+(b.b.isMobile?250:200);i=Object(ca.a)(e),Object(Rs.b)(i,e)}return this.tabId=e,Object(si.a)(),b.b.isMobile&&2===s&&e<2&&document.body.classList.remove("is-right-column-shown"),-1!==s&&e>s&&(e<2||!j.a.findItemByType("im"))&&j.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),dt.a.invokeApiSingle("account.updateStatus",{offline:this.offline})):Promise.resolve()}createNewChat(){const e=new vr(this,G.a,C.a,_a,i.a,o.a,r.a,n.default,ms.a,E.a,fr.a,Ye.a,dt.a,Vi.a,Xe.a,ua.a,Nt.a,va,v.a,Er.a,Ft.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=ss.getTab(gr);e&&e.close();ss.sharedMediaTab.setPeer(this.chat.peerId,this.chat.threadId)&&(ss.sharedMediaTab.loadSidebarMedia(!0),ss.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=Ee.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===Ee.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 St.a({peerId:i.userId.toPeerId(!1),onlyFirstName:!0}).element,s.length-1]),"sendMessageEmojiInteractionSeen"===r._){c?c.pop():c=[];const e=Object(Ce.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 Zl(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(Qa.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=sc);var ic=sc;class nc extends Hr{constructor({video:e,play:t=!1,streamable:s=!1,duration:i,onPlaybackRackMenuToggle:n,onPip:a}){if(super(),this.video=e,this.wrapper=document.createElement("div"),this.wrapper.classList.add("ckin__player"),this.onPlaybackRackMenuToggle=n,this.onPip=a,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 _e(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=xe(0|s.duration);const l=new sr(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(e)};n.add(s)("enterpictureinpicture",()=>{e(!0)}),n.add(s)("leavepictureinpicture",()=>{e(!1)})}he.a||(n.add(s)("click",()=>{this.togglePlay()}),n.add(document)("keydown",e=>{if(a.a.overlaysActive>1||document.pictureInPictureElement)return;const{key:s,code:i}=e;let n=!0;if("KeyF"===i)this.toggleFullScreen();else if("KeyM"===i)fe.muted=!fe.muted;else if("Space"===i)this.togglePlay();else if(!e.altKey||"Equal"!==i&&"Minus"!==i)!t.classList.contains("ckin__fullscreen")||"ArrowLeft"!==s&&"ArrowRight"!==s?n=!1:"ArrowLeft"===s?fe.seekBackward({action:"seekbackward"}):fe.seekForward({action:"seekforward"});else{const e="Equal"===i?1:-1,t=fe.playbackRate,s=nc.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=xe(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=xe(Math.round(s.duration||e)):Object(pe.e)(s).then(()=>{r.innerHTML=xe(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=nc.PLAYBACK_RATES.map((e,t)=>({regularText:e+"x",onClick:()=>{fe.playbackRate=e}})),t=Ys(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;nc.PLAYBACK_RATES_ICONS.forEach(t=>{t="tgico-"+t,e.classList.remove(t)});let t=nc.PLAYBACK_RATES.indexOf(fe.playbackRate);-1===t&&(t=nc.PLAYBACK_RATES.indexOf(1)),e.classList.add("tgico-"+nc.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}}nc.PLAYBACK_RATES=[.5,1,1.5,2],nc.PLAYBACK_RATES_ICONS=["playback_05","playback_1x","playback_15","playback_2x"];var ac=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 oc 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(Le.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(Le.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 vc,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 Oe({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)/Lt.a.width>.2||e>125)return e<0?this.buttons.prev.click():this.buttons.next.click(),!0;return(Math.abs(t)/Lt.a.height>.2||t>125)&&(this.close(),!0)},verifyTouchTarget:e=>"INPUT"!==e.target.tagName&&!Object(Le.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&&j.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,M.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 ac(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 vc||e.classList.contains("grid-item")?(l=e,c=e.getBoundingClientRect()):e instanceof SVGImageElement||e.parentElement instanceof SVGForeignObjectElement?(l=Object(Le.a)(e,"attachment"),c=l.getBoundingClientRect()):e.classList.contains("profile-avatars-avatar")&&(l=Object(Le.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(Le.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?Lt.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=Lt.a.width/2-c.width/2,t=Lt.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"),L=this.setMoverAnimationPromise=Object(ie.a)(),C={onAnimationEnd:L},M=setTimeout(()=>{L.isFulfilled||L.isRejected||L.resolve()},1e3);if(L.finally(()=>{this.dispatchEvent("setMoverAfter"),this.setMoverAnimationPromise===L&&(this.setMoverAnimationPromise=null),clearTimeout(M)}),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;",L.resolve()},r),i.classList.remove("opening"),C;{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(us.b)(t,s))),i.style.display="",Object(Me.b)(()=>{i.classList.add(o?"moving":"active")})}return i.classList.add("opening"),yield Object(Me.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,L.resolve()},r),w&&this.sizeTailPath(w,h,b,r,!0,S,f),C}))}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(Le.a)(e,"document")){if(Object(Le.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(us.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 St.a({peerId:e,dialog:!1,onlyFirstName:!1,plainText:!1}).element:(i=document.createElement("span"),i.innerHTML=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||Ee.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 ac(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()}},j.a.pushItem(this.navigationItem)));const v=this.content.mover,f=Lt.a.width;let y=0;const w=Lt.a.height;w<1e6&&!b.b.isMobile&&(y=120);const S=w-120-y;let L=Promise.resolve();const M=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,M.type);let s;if(t.downloaded)s=new Image,s.src=t.url;else{const i=r.a.getStrippedThumbIfNeeded(e,t,!0);i&&(L=i.loadPromise,s=i.image)}s&&(s.classList.add("thumbnail"),u.append(s))}const I=!(!h||!e.supportsStreaming),E=I?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 nc({video:s,play:!0,streamable:I,onPlaybackRackMenuToggle:e=>{this.wholeDiv.classList.toggle("hide-caption",!!e)},onPip:e=>{if(!e&&window.appMediaViewer!==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?j.a.removeItem(this.navigationItem):j.a.pushItem(this.navigationItem)),t&&(e?(this.releaseSingleMedia(!1),this.releaseSingleMedia=void 0,fe.setPictureInPicture(s)):this.releaseSingleMedia=fe.setSingleMedia(s,d))}})).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(I){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=I?Promise.resolve():C.a.downloadDoc(e);return I||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(us.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=L.then(a)}else{const t=()=>this.setMoverToTarget(n,!1,i).then(({onAnimationEnd:t})=>{this.lazyLoadQueue.unshift({load:()=>{const s=ce.a.getCacheContext(e,M.type),i=h?C.a.downloadDoc(e):r.a.preloadPhoto(e,M);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(us.a)(e,t,()=>{this.updateMediaSource(n,t,"img"),i&&Object(Me.b)(()=>{i.remove()}),s.append(e)})}}}).catch(e=>{this.log.error(e),this.preloader.attach(v),this.preloader.setManual()}),i}})});P=L.then(t)}return this.setMoverPromise=P.catch(()=>{this.setMoverAnimationPromise=null}).finally(()=>{this.setMoverPromise=null})}))}}var rc=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 lc extends oc{constructor(){let e;super(new L({processItem:e=>{const t="inputMessagesFilterDocument"===this.searchContext.inputFilter._,{mid:s,peerId:n}=e,a=i.a.getMediaFromMessage(e);if(a&&(!t||lc.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 Zs(e.peerId,[e.mid],"chat",()=>{this.target={element:this.content.media},this.close()})},this.onForwardClick=()=>{const e=this.target;e.mid&&new Js({[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=ss.getTab(es);e&&e.close()}ic.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,ic.chat.bubbles.lazyLoadQueue.queueId);else{let e=null;e=s.media.webpage?s.media.webpage.document:s.media.document,e&&C.a.saveDocFile(e,ic.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})),m(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 rc(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 cc 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 dc=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 hc extends oc{constructor(e){super(new cc({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),ic.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 dc(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 pc=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 uc=e=>{d.a.removeFromAvatarsCache(e),Array.from(document.querySelectorAll('avatar-element[data-peer-id="'+e+'"]')).forEach(e=>{e.update()})};function gc(e,t,s,a,o,l){return pc(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 lc).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(da.a)(a)&&a&&(c=r.a.getPhoto(a));const e=e=>e.map(e=>({element:e.element,photoId:e.item}));new hc(t).openMedia(c.id,d(),void 0,o?e(o):void 0,l?e(l):void 0)}}))}a.a.addEventListener("avatar_update",uc),a.a.addEventListener("peer_title_edit",e=>{d.a.isAvatarCached(e)||uc(e)});const mc=new Map,bc=new Set;class vc extends HTMLElement{constructor(){super(...arguments),this.addedToQueue=!1}disconnectedCallback(){const e=mc.get(this.peerId);e&&e.has(this)&&(e.delete(this),e.size||mc.delete(this.peerId)),this.lazyLoadQueue&&this.lazyLoadQueue.unobserve(this)}attachClickEvent(){let e=!1;Object(l.b)(this,t=>pc(this,void 0,void 0,(function*(){if(Object(c.a)(t),e)return;const s=this.peerId;e=!0,yield gc(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=mc.get(t);e&&(e.delete(this),e.size||mc.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(!bc.has(this.peerId)){if(this.addedToQueue)return;this.addedToQueue=!0;let e=mc.get(this.peerId);return e||(e=new Set,mc.set(this.peerId,e)),e.add(this),this.r(!0),void this.lazyLoadQueue.push({div:this,load:()=>(bc.add(this.peerId),this.update())})}this.addedToQueue&&this.lazyLoadQueue.unobserve(this)}bc.add(this.peerId);const e=this.r(),t=e?e.loadPromise:Promise.resolve();this.addedToQueue&&t.finally(()=>{this.addedToQueue=!1});const s=mc.get(this.peerId);if(s){s.delete(this);const e=Array.from(s);mc.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?lt({langPackKey:"PinFolderLimitReached"}):new gt("pinned-dialogs-too-much",{buttons:[{langKey:"OK",isCancel:!0},{langKey:"FiltersSetupPinAlert",callback:()=>{new wn($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 pr(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 _t(this.selectedId)},this.onContextMenu=e=>{this.init&&(this.init(),this.init=null);let t=null;try{t=Object(vt.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&&!Nt.a.isPeerLocalMuted(this.dialog.peerId)},{icon:"unmute",text:"ChatList.Context.Unmute",onClick:this.onUnmuteClick,verify:()=>this.selectedId!==a.a.myId&&Nt.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=Ys(this.buttons),this.element.id="dialogs-contextmenu",this.element.classList.add("contextmenu"),document.getElementById("page-chats").append(this.element)}}var yc,wc;!function(e){e[e.Connected=0]="Connected",e[e.Connecting=1]="Connecting",e[e.Closed=2]="Closed",e[e.TimedOut=3]="TimedOut"}(yc||(yc={}));class Sc{constructor(e){this.hadConnect=!1,this.connecting=!1,this.timedOut=!1,this.updating=!1,this.setConnectionStatus=()=>{Hn.a.get("dc").then(e=>{e||(e=Un.a.baseDcId),this.setFirstConnectionTimeout&&(clearTimeout(this.setFirstConnectionTimeout),this.setFirstConnectionTimeout=0);const t=a.a.connectionStatus["NET-"+e],s=t&&t.status===yc.Connected;this.connecting&&s&&vi.a.forceGetDifference(),s&&!this.hadConnect&&(this.hadConnect=!0),this.timedOut=t&&t.status===yc.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=Sc.CHANGE_STATE_DELAY;if(this.connecting)if(this.timedOut){const e=this.getA("ConnectionStatus.ForceReconnect",()=>dt.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",()=>dt.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(ns.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,Sc.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()}Sc.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"}(wc||(wc={}));const Cc=window.devicePixelRatio,Mc=20*Cc,Ic=2.5*Cc,Ec=2*Cc,Pc=1*Cc;function kc(e=!1){const t=document.createElement("canvas");t.width=t.height=Mc;const s=t.getContext("2d"),i=(Mc-(3*Ec+2*Ic))/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*=Cc;Lc(s,i+e*Ec+e*Ic,(Mc-n)/2,Ec,n,Pc,!0)}return!0};return{canvas:t,startAnimation:()=>{Object(ke.a)(o),o()},setActive:t=>{e=t,o()}}}var Tc=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 xc extends zs{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;Us(e.dom.listEl,this.list,t),s&&this.onListLengthChange&&this.onListLengthChange()},onElementCreate:(e,t)=>{const s=t?[]:void 0,{dom:i}=Oc.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:Me.c}),this.list=e,this.indexKey=t,this.onListLengthChange=s}clear(){this.list.innerHTML="",super.clear()}}class Ac{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 fc,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 Vn({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 Ks({avatarSize:42,createChatListOptions:{dialogSize:48,new:!0},autonomous:!1,onListLengthChange:s});this.loadContacts=()=>{const t=Lt.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(Me.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(ct.a)(this._onListLengthChange,100,!1,!0);const e=document.createElement("div");e.classList.add("connection-status-bottom"),e.append(this.folders.container),he.a&&qs({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",()=>{I.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}},j.a.unshiftItem(this.filtersNavigationItem)):this.filtersNavigationItem&&(j.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(),I.c.getState().then(e=>(fe.setPlaybackParams(e.playbackParams),a.a.addEventListener("media_playback_params",e=>{I.c.pushToState("playbackParams",e)}),this.onStateLoaded(e))),b.b.addEventListener("resize",()=>{this.changeFiltersAllChatsKey()}),new Sc(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(ns.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),Us(n.menu,t,s.orderIndex),Us(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 Tc(this,void 0,void 0,(function*(){if(e.notifySettings)for(const t in e.notifySettings)Object(ws.a)(t),Nt.a.savePeerSettings({key:t,settings:e.notifySettings[t]});Nt.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)),I.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)&&!Nt.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 xc(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):i.innerHTML=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);Us(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;Us(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=>Tc(this,void 0,void 0,(function*(){const{chatList:n,filterId:a,indexKey:o}=this;let r=Lt.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=ms.a.getAnimatedEmojiSticker(e);return n?As({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 fn($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(us.b)(e,"assets/img/EmptyChats.svg"),Object(Me.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?ic.setInnerPeer:ic.setPeer).bind(ic);e.dataset.autonomous=""+ +n,e.addEventListener("mousedown",e=>{if(0!==e.button)return;this.log("dialogs click list");const s=e.target,i=Object(vt.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(vt.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"),ks({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 St.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=Nt.a.isPeerLocalMuted(e.peerId,!0);s!==t.listEl.classList.contains("is-muted")&&Object(ns.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(bs.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(bs.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(ns.a)(t.unreadBadge,"is-visible",d,g,d?void 0:()=>{t.unreadBadge.remove()},h?0:2),t.mentionsBadge&&Object(ns.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||Ee.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=kc(i.classList.contains("active"));t.classList.add("dialog-group-call-icon"),i.append(t),n()}s&&Object(ns.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;Nt.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(!dr)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=Oc.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 vc;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 St.a({peerId:b,fromName:p,dialog:o,onlyFirstName:n,plainText:!1});y.append(w.element),y.classList.add("tgico"),y.append(...Gt(b));const S=document.createElement("span");S.classList.add("user-last-message"),S.setAttribute("dir","auto");const L=document.createElement("li");L.classList.add("chatlist-chat"),i&&Object(te.a)(L),L.append(v,f),L.dataset.peerId=""+b;const C=document.createElement("span");C.classList.add("message-status","sending-status");const M=document.createElement("span");M.classList.add("message-time");const I=document.createElement("div");I.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(C,M),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:C,lastTimeSpan:M,unreadBadge:I,lastMessageSpan:S,containerEl:L,listEl:L,subtitleEl:T};if(t){t[r?"append":"prepend"](L)}return c||(L.dialogDom=x,(null===(g=ic.chat)||void 0===g?void 0:g.peerId)===b&&this.setDialogActive(L,!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=ic.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 Oc=new Ac;le.a.appDialogsManager=Oc;var _c=t.default=Oc},191: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}])},65: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(101),o=s(91),r=s(32);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"}}},68:function(e,t,s){"use strict";s.d(t,"a",(function(){return r}));var i=s(34),n=s(75),a=s(7),o=s(44);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)}}},76: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}))},83:function(e,t,s){"use strict";function i(e,t){return e.closest(t)}s.d(t,"a",(function(){return i}))},92: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=11.9d6292221b761a8e5ba9.chunk.js.map \ No newline at end of file diff --git a/public/11.9d6292221b761a8e5ba9.chunk.js.map b/public/11.9d6292221b761a8e5ba9.chunk.js.map new file mode 100644 index 00000000..65c1e739 --- /dev/null +++ b/public/11.9d6292221b761a8e5ba9.chunk.js.map @@ -0,0 +1 @@ +{"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/dom/setInnerHTML.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","setInnerHTML","elem","html","innerHTML","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","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","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","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","parts","audioPerformer","htmlToSpan","date","wrapSenderToPeer","titleEl","middleEllipsisEl","fontWeight","sizeType","audioTitle","fileName","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","wrapEmojiText","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","rQuestion","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","descriptionParts","nameDiv","_downloadDiv","save","canOpenAfter","downloading","saveDocFile","noThumb","noFadeIn","blurAfter","setAttachmentSize","regular","thumbImage","image","isFit","loadThumbPromise","isGif","photoSize","getStrippedThumbIfNeeded","needFadeIn","renderOnLoad","renderImageWithFadeIn","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","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","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","rDescription","previewDiv","getAbbreviation","rTitle","subtitleFragment","htmlToDocumentFragment","HTMLAnchorElement","decodeURIComponent","href","firstChild","wrapPlainText","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","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","getSelf","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","wrapDraftText","ul","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","menu","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","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","getDialogOnly","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","afterSetPromise","onRenderScrollSet","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","texts","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","onSendScheduledClick","onReplyClick","onEditClick","initMessageEditing","onCopyClick","onCopyAnchorLinkClick","onCopyLinkClick","threadMessage","onPinClick","onUnpinClick","onRetractVote","onStopPoll","stopPoll","closest","reactionsMenu","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","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","question","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","appWebPagesManager","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","path","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","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","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","getFile","lastBackgroundUrl","chatBubbles","chatPositions","getFromCache","themeColor","hslaStringToHex","backgroundUrl","applyHighlightningColor","setTheme","setCurrentBackground","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","descriptionElement","ignoreSelf","getPeerTyping","onlines","getOnlines","useWhitespace","typingContainer","getPeerStatus","onPlaybackRackMenuToggle","onPip","playbackRateButton","skin","stylePlayer","setBtnMenuToggle","initDuration","buildControls","timeDuration","pipButton","fullScreenButton","timeElapsed","leftControls","requestPictureInPicture","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","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","perf","performance","scrollTopWas","rectContainer","rectTarget","firstY","firstElement","lastElement","elementOverflow","sliceFromStart","sliceFromEnd","deleteDialog","setOffsets","onChatsScrollTop","loadDialogs","chatsPreloader","allUnreadCount","bottomPart","allChatsIntlElement","addFilter","onStateLoaded","foldersScrollable","filtersNavigationItem","unshiftItem","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":"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","file":"11.9d6292221b761a8e5ba9.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","/*\r\n * https://github.com/morethanwords/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) {\r\n elem.setAttribute('dir', 'auto');\r\n elem.innerHTML = html;\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;\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 && attribute.title || doc.file_name;\r\n artist = attribute && 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),\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 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 // 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\";\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 if(!isVoice) {\n const parts: (Node | string)[] = [];\n if(doc.audioPerformer) {\n parts.push(htmlToSpan(doc.audioPerformer));\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 middleEllipsisEl.innerHTML = doc.audioTitle || doc.fileName;\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: HTMLImageElement[] = [];\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,\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\";\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,\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) p.innerHTML = 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 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: string, row: Row) => {\n //fastRaf(() => {\n row.title.innerHTML = 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\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 title.innerHTML = poll.poll.rQuestion;\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 answerTitle.innerHTML = 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\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 textEl.innerHTML = 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
${RichTextProcessor.wrapEmojiText(answer.text)}
\r\n \r\n \r\n \r\n \r\n
\r\n `;\r\n }).join('');\r\n\r\n this.innerHTML = `\r\n
${poll.rQuestion}
\r\n
\r\n
\r\n
\r\n
\r\n ${votes}`;\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\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[] = [];\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.fileName || '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.innerHTML = 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;\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 return blur(cacheContext.url, 12).then(url => {\r\n return renderOnLoad(url);\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(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');\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 div.innerHTML = `\r\n \r\n `;\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 messageDiv.innerHTML = 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, CLICK_EVENT_NAME } from \"../helpers/dom/clickEvent\";\nimport ListenerSetter from \"../helpers/listenerSetter\";\nimport { FormatterArguments, i18n, LangPackKey } from \"../lib/langPack\";\nimport CheckboxField from \"./checkboxField\";\nimport { closeBtnMenu } from \"./misc\";\nimport ripple from \"./ripple\";\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 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\";\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 webpage.rDescription = RichTextProcessor.wrapRichText(limitSymbols(message.message, 150, 180));\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 previewDiv.innerHTML = RichTextProcessor.getAbbreviation(webpage.title || webpage.display_url || webpage.description || webpage.url, true);\n }\n \n let title = webpage.rTitle || '';\n let subtitle = webpage.rDescription || '';\n\n const subtitleFragment = htmlToDocumentFragment(subtitle);\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) {\n //title = new URL(webpage.url).hostname;\n title = 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, { PrivacySectionStr } from \"../../../privacySection\";\r\nimport { i18n, LangPackKey } from \"../../../../lib/langPack\";\r\nimport anchorCopy from \"../../../../helpers/dom/anchorCopy\";\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 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: '+380509144504'\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 { 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 passwordInputField.label.innerHTML = 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 blur(cacheContext.url, 12, 4)\r\n .then(url => {\r\n if(!middleware()) {\r\n deferred.resolve();\r\n return;\r\n }\r\n\r\n onReady(url);\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\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 this.h6.innerHTML = 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\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 span.innerHTML = 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\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 = 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 const peers = filter[key].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\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') this.onEditOpen();\r\n else this.onCreateOpen();\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 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 span.innerHTML = RichTextProcessor.wrapEmojiText(postAuthor) + ',' + 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: string;\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.innerHTML = 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: 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 titleDiv.innerHTML = 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\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
${RichTextProcessor.wrapEmojiText(set.title)}
\r\n `;\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 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 title.innerHTML = 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 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 selectElementContents from \"../../helpers/dom/selectElementContents\";\r\nimport cancelSelection from \"../../helpers/dom/cancelSelection\";\r\nimport SelectionSaver from \"../../helpers/selectionSaver\";\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 ) {\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 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 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 fromUp = maxBubbleId > 0 && (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 = this.getMountedBubble(lastMsgId);\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 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 attachmentDiv.innerHTML = 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 buttonEl.insertAdjacentHTML('beforeend', text);\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 if(webpage.rTitle) {\r\n let titleDiv = document.createElement('div');\r\n titleDiv.classList.add('title');\r\n const strong = document.createElement('strong');\r\n setInnerHTML(strong, webpage.rTitle);\r\n titleDiv.append(strong);\r\n quoteTextDiv.append(titleDiv);\r\n t = titleDiv;\r\n }\r\n\r\n if(webpage.rDescription) {\r\n let textDiv = document.createElement('div');\r\n textDiv.classList.add('text');\r\n setInnerHTML(textDiv, webpage.rDescription);\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 texts = [];\r\n if(contact.first_name) texts.push(RichTextProcessor.wrapEmojiText(contact.first_name));\r\n if(contact.last_name) texts.push(RichTextProcessor.wrapEmojiText(contact.last_name));\r\n\r\n contactDiv.innerHTML = `\r\n
\r\n
${texts.join(' ')}
\r\n
${contact.phone_number ? '+' + formatPhoneNumber(contact.phone_number).formatted : 'Unknown phone number'}
\r\n
`;\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 title.innerHTML = 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 = 28;\nconst PADDING = 4;\nconst 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 private container: HTMLElement;\n private reactionsMap: Map;\n private 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 } 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} = initResult;\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 openBtnMenu(element, () => {\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\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 if(this.message._ === 'message' && !this.chat.selection.isSelecting && !this.message.pFlags.is_outgoing && !this.message.pFlags.is_scheduled) {\r\n const position: 'horizontal' | 'vertical' = (IS_APPLE || IS_TOUCH_SUPPORTED)/* && false */ ? 'horizontal' : 'vertical';\r\n reactionsMenu = this.reactionsMenu = new ChatReactionsMenu(this.appReactionsManager, position, this.middleware);\r\n reactionsMenu.init(this.appMessagesManager.getGroupsFirstMessage(this.message));\r\n element.prepend(reactionsMenu.widthContainer);\r\n\r\n const size = 42;\r\n const margin = 8;\r\n const totalSize = size + margin;\r\n if(position === 'vertical') {\r\n menuPadding = {\r\n top: 24,\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: 36,\r\n left: 24\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 },\r\n menuPadding\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 RichTextProcessor from \"../../lib/richtextprocessor\";\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 fileName: file.name ? RichTextProcessor.wrapEmojiText(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 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 name.innerHTML = 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 description.innerHTML = 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\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 btn.innerHTML = 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\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 preview.innerHTML = 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 title.innerHTML = RichTextProcessor.wrapEmojiText(item.title);\r\n \r\n const description = document.createElement('div');\r\n description.classList.add('inline-helper-result-description');\r\n description.innerHTML = 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 btnSwitchToPM.insertAdjacentHTML('beforeend', 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\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-32', '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 = 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 = 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 { MyDocument } from \"../../lib/appManagers/appDocsManager\";\nimport { Message } from \"../../layer\";\nimport MediaProgressLine from \"../mediaProgressLine\";\nimport VolumeSelector from \"../volumeSelector\";\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, 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 title = doc.audioTitle || doc.fileName;\n subtitle = doc.audioPerformer || 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);\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 { MediaSize } from \"../../helpers/mediaSizes\";\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.innerHTML = 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, 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';\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 = /* window.location.origin + window.location.pathname + */'assets/img/' + theme.background.slug + '.svg';\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 // setTimeout(() => {\n this.applyCurrentTheme();\n // }, 0);\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 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) {\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.setBackground('', 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 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\";\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\n constructor({video, play = false, streamable = false, duration, onPlaybackRackMenuToggle, onPip}: {\n video: HTMLVideoElement, \n play?: boolean, \n streamable?: boolean, \n duration?: number,\n onPlaybackRackMenuToggle?: VideoPlayer['onPlaybackRackMenuToggle'],\n onPip: VideoPlayer['onPip']\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\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 this.onPip(pip);\n };\n\n listenerSetter.add(video)('enterpictureinpicture', () => {\n onPip(true);\n });\n\n listenerSetter.add(video)('leavepictureinpicture', () => {\n onPip(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) { // 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.innerHTML = 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;\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 if(!pip && (window as any).appMediaViewer !== 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 });\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 = '';\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\";\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.unshiftItem(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 elements.title.innerHTML = 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 titleSpan.innerHTML = 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/12.49af8796ae03f597ea67.chunk.js b/public/12.49af8796ae03f597ea67.chunk.js new file mode 100644 index 00000000..bd6cb879 --- /dev/null +++ b/public/12.49af8796ae03f597ea67.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[12,13,15],{104:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},105: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)}}},114:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(94);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},119:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(69);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()}}},139:function(t,e,i){"use strict";i.r(e);var n=i(60),s=i(61),a=i(34),o=i(92),r=i(87),l=i(57),c=i(106),u=i(119),d=i(27),h=i(7),p=i(95),m=i(32),g=i(56),b=i(96),f=i(58),v=i(76);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,107)).then(t=>{t.default.mount()}),N&&N.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,N=new u.a(r,S);return t.imageDiv.append(N.container),Promise.all([N.load(),L()])},null,()=>{y.focus(),a.c.pushToState("authState",{_:"authStatePassword"})});e.default=w},58: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}))},64:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(111),s=i(104),a=i(94),o=i(114);var r=i(7),l=i(27),c=i(72);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(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 c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));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:l,canBeEdited:c=!0}=t;let d,h,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});d.addEventListener("input",()=>{Object(o.a)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())}),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&(Object(r.b)(d,e,void 0,"placeholder"),this.inputFake&&Object(r.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;h=()=>{const s=d.classList.contains("error"),o=l?d.value.length:[...Object(a.a)(d,!1).value].length,r=i-o,c=r<0;d.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",h)}this.input=d}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?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.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(c.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(a.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(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.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(r.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},72: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},76: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}))},92: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},94:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(1),s=i(27),a=i(105);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},95: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)}}},96:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); +//# sourceMappingURL=12.49af8796ae03f597ea67.chunk.js.map \ No newline at end of file diff --git a/public/12.49af8796ae03f597ea67.chunk.js.map b/public/12.49af8796ae03f597ea67.chunk.js.map new file mode 100644 index 00000000..63e84afd --- /dev/null +++ b/public/12.49af8796ae03f597ea67.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.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/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","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","entities","offset","nodeType","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","join","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","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","innerHTML","lastChild","replaceWith","textContent","init","target","text","preventDefault","originalEvent","clipboardData","getData","usePlainText","html","replace","span","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","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","htmlToSpan"],"mappings":"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","file":"12.49af8796ae03f597ea67.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\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\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 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 { 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 text = RichTextProcessor.wrapDraftText(text, {entities});\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,\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 this.label.innerHTML = 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 = 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\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","/*\r\n * https://github.com/morethanwords/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) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/12.98f15505a7862a1f5623.chunk.js b/public/12.98f15505a7862a1f5623.chunk.js deleted file mode 100644 index 53b7fb13..00000000 --- a/public/12.98f15505a7862a1f5623.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[12,13,15],{104:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},105: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:"messageEntityPre"},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)}}},114:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(94);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},119:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(69);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()}}},139:function(t,e,i){"use strict";i.r(e);var n=i(60),s=i(61),a=i(34),o=i(92),r=i(87),l=i(57),c=i(106),u=i(119),d=i(27),h=i(7),p=i(95),m=i(32),g=i(56),b=i(96),f=i(58),v=i(76);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,107)).then(t=>{t.default.mount()}),N&&N.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,N=new u.a(r,S);return t.imageDiv.append(N.container),Promise.all([N.load(),L()])},null,()=>{y.focus(),a.c.pushToState("authState",{_:"authStatePassword"})});e.default=w},58: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}))},64:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(111),s=i(104),a=i(94),o=i(114);var r=i(7),l=i(27),c=i(72);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(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 c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));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:l,canBeEdited:c=!0}=t;let d,h,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});d.addEventListener("input",()=>{Object(o.a)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())}),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&(Object(r.b)(d,e,void 0,"placeholder"),this.inputFake&&Object(r.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;h=()=>{const s=d.classList.contains("error"),o=l?d.value.length:[...Object(a.a)(d,!1).value].length,r=i-o,c=r<0;d.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",h)}this.input=d}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?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.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(c.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(a.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(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.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(r.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},72: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},76: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}))},92: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},94:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(1),s=i(27),a=i(105);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},95: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)}}},96:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); -//# sourceMappingURL=12.98f15505a7862a1f5623.chunk.js.map \ No newline at end of file diff --git a/public/12.98f15505a7862a1f5623.chunk.js.map b/public/12.98f15505a7862a1f5623.chunk.js.map deleted file mode 100644 index ae18ed14..00000000 --- a/public/12.98f15505a7862a1f5623.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.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/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","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","entities","offset","nodeType","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","join","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","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","innerHTML","lastChild","replaceWith","textContent","init","target","text","preventDefault","originalEvent","clipboardData","getData","usePlainText","html","replace","span","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","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","htmlToSpan"],"mappings":"6FAMe,SAASA,EAAgBC,EAASC,GAC/C,OAAOD,EAAGE,QAAQ,IAAID,MAPxB,mC,iCCAA,oEAoBO,MAAME,EAAsD,CACjEC,KAAM,CACJC,MAAO,+IACPC,WAAY,qBAEdC,UAAW,CACTF,MAAO,+BACPC,WAAY,0BAEdE,OAAQ,CACNH,MAAO,2BACPC,WAAY,uBAEdG,UAAW,CACTJ,MAAO,gDACPC,WAAY,oBAEdI,cAAe,CACbL,MAAO,0CACPC,WAAY,uBAEdK,KAAM,CACJN,MAAO,iBACPC,WAAY,wBAEdM,YAAa,CACXP,MAAO,WACPC,WAAY,4BAEdO,QAAS,CACPR,MAAO,qBACPC,WAAY,yBAoBVQ,EAAkB,IAAIC,IAAI,CAC9B,MACA,IACA,KACA,KACA,UACA,KACA,KACA,KACA,KACA,KACA,KACA,OAGa,SAASC,EAAoBC,EAAmBC,EAAiBC,EAAgBC,EAAgBC,EAAoBC,EAA4BC,EAAS,CAACA,OAAQ,IAChL,GAAqB,IAAlBN,EAAKO,SAAgB,CACtB,IAAIC,EAAYR,EAAKQ,UAerB,GANGL,IAAYH,EACbE,EAAKO,KAAKD,EAAUE,OAAO,EAAGN,GAAa,IAASI,EAAUE,OAAON,IAErEF,EAAKO,KAAKD,GAGTH,GAAYG,EAAUG,QACpBX,EAAKY,WAAY,CAClB,MAAMC,EAAgBb,EAAKa,cAG3B,IAAI,MAAMC,KAAQ5B,EAAc,CAC9B,MAAM6B,EAAM7B,EAAa4B,GACnB7B,EAAU4B,EAAc5B,QAAQ8B,EAAI3B,MAAQ,uBACF,QAA7CH,aAAO,EAAPA,EAAS+B,aAAa,sBAUH,yBAAnBD,EAAI1B,WACLgB,EAASI,KAAK,CACZQ,EAAGF,EAAI1B,WACP6B,IAAMjC,EAA8BkC,KACpCb,OAAQA,EAAOA,OACfK,OAAQH,EAAUG,SAEO,6BAAnBI,EAAI1B,WACZgB,EAASI,KAAK,CACZQ,EAAGF,EAAI1B,WACPiB,OAAQA,EAAOA,OACfK,OAAQH,EAAUG,OAClBS,QAAUnC,EAAwBoC,QAAQC,OAAOC,aAGnDlB,EAASI,KAAK,CACZQ,EAAGF,EAAI1B,WACPiB,OAAQA,EAAOA,OACfK,OAAQH,EAAUG,WAQ5B,YADAL,EAAOA,QAAUE,EAAUG,QAI7B,GAAqB,IAAlBX,EAAKO,SACN,OAGF,MAAMiB,EAAarB,IAAYH,EACzByB,EAAU5B,EAAgB6B,IAAI1B,EAAK2B,SACzC,GAAGF,GAAWvB,EAAKS,OACjBV,EAAMQ,KAAKP,EAAK0B,KAAK,KACrB1B,EAAK2B,OAAO,EAAG3B,EAAKS,UAClBL,EAAOA,YACJ,GAAGN,aAAgB8B,iBAAkB,CAC1C,MAAMC,EAAM/B,EAAK+B,IACdA,IACD7B,EAAKO,KAAKsB,GACVzB,EAAOA,QAAUyB,EAAIpB,QAItBa,IAAepB,GAChBF,EAAKO,KAAK,KAGZ,MAAMuB,EAAchC,EAAKiC,QArHH,iCAsHhBC,EAAoB7B,aAAQ,EAARA,EAAUM,OAEpC,IAAIwB,EAAWnC,EAAKoC,WACpB,KAAMD,GACJpC,EAAoBoC,EAAUlC,EAAOC,EAAMC,EAASC,EAAWC,EAAUC,GACzE6B,EAAWA,EAASE,YAOtB,GAJGb,GAAcpB,GACfF,EAAKO,KAAK,KAGTuB,GAAehC,EAAKqC,cACrBnC,EAAKO,KAAK,OACRH,EAAOA,YAGgBgC,IAAtBJ,GACD,IAAI,IAAIK,EAAIL,EAAmBvB,EAASN,EAASM,OAAQ4B,EAAI5B,IAAU4B,IACnElC,EAASkC,GAAG5B,OAKpB,MAAM6B,EAAYtC,EAAKS,OACpBc,GAAWe,IACZvC,EAAMQ,KAAKP,EAAK0B,KAAK,KACrB1B,EAAK2B,OAAO,EAAGW,KACblC,EAAOA,QAGRkC,GAA8B,MAAjBxC,EAAK2B,SAAmB3B,EAAKqC,cAC3CpC,EAAMQ,KAAK,MACTH,EAAOA,U,iCC9Mb,sDAUe,MAAMmC,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,MAA2BtC,KAAOkC,KAAKH,gBAAkB,OAAS,WACxEG,KAAKK,6BAA+BL,KAAKK,+BArCzC,MAAMD,EAAQJ,KAAKI,MACnBA,EAAMtC,KAAO,WACbsC,EAAME,aAAa,WAAY,IAC/BF,EAAMG,KAAO,qBACbH,EAAMI,aAAe,MAUrB,MAAMC,EAAWC,SAASC,cAAc,SACxCF,EAASP,UAAUU,IAAI,YACvBH,EAASI,UAAY,EACrBJ,EAAS3C,KAAO,WAChBsC,EAAMvC,cAAciD,QAAQL,GAC5BL,EAAMvC,cAAckD,aAAaN,EAASO,YAAaZ,EAAMf,aAE7D,MAAMY,EAAgBD,KAAKC,cAAgBS,SAASC,cAAc,QAClEV,EAAcC,UAAUU,IAAI,iBAAkB,SAE9CZ,KAAKiB,UAAUf,UAAUU,IAAI,wBAC7BZ,KAAKiB,UAAUC,OAAOjB,GAEtBA,EAAckB,iBAAiB,QAASnB,KAAKF,mBAC7CG,EAAckB,iBAAiB,WAAYnB,KAAKF,sB,iCCjDpD,8CAQe,SAASsB,EAAaC,GACnC,OAAGA,EAAQC,aAAa,oBAA0C,UAApBD,EAAQ1C,SAI5C,YAAa0C,GAAS,GAAOE,MAAMC,QAElCH,EAA6BE,MAAMC,S,iCCfhD,8CAUe,MAAMC,EAMnB,YAAsBC,EAAkDC,GAAlD,KAAAD,qBAAkD,KAAAC,OAHjE,KAAAC,UAAY,EAIjB5B,KAAKiB,UAAYP,SAASC,cAAc,OACxCX,KAAKiB,UAAUf,UAAUU,IAAI,yBAGxB,OACL,OAAGZ,KAAK6B,YAAoB7B,KAAK6B,YAC1B7B,KAAK6B,YAAc,IAAaC,qBAAqB,CAC1Db,UAAWjB,KAAKiB,UAChBc,MAAM,EACNC,UAAU,EACVC,MAAOjC,KAAK2B,KACZO,OAAQlC,KAAK2B,KACbQ,SAAS,GAER,4BAA4BC,KAAKC,IAElCrC,KAAKsC,UAAYD,EACjBrC,KAAKsC,UAAUnB,iBAAiB,aAAcoB,KAGX,IAA7BvC,KAAKsC,UAAUE,WAAmBD,GAAgBvC,KAAK4B,YAC1B,IAA9B5B,KAAKsC,UAAUE,WAAoBD,GAAgBvC,KAAK4B,aACvD5B,KAAKsC,UAAUG,SAAS,GACxBzC,KAAKsC,UAAUI,WAIrB1C,KAAK0B,mBAAmBrB,4BAA8B,KACjDL,KAAK0B,mBAAmB7B,iBACzBG,KAAKsC,UAAUK,aAAa,GAC5B3C,KAAKsC,UAAUM,SAAW,EAC1B5C,KAAK4B,UAAY,GACjB5B,KAAKsC,UAAUO,SAEf7C,KAAKsC,UAAUK,cAAc,GAC7B3C,KAAKsC,UAAUM,SAAW,GAC1B5C,KAAK4B,UAAY,EACjB5B,KAAKsC,UAAUO,SAIZ,IAAaC,kBAAkBT,KAInC,SACFrC,KAAKsC,WACNtC,KAAKsC,UAAUS,Y,iCChErB,4IAyBA,IAAIC,EAuHJ,MAAMC,EAAO,IAAI,IAAK,iBAAiB,EArHpB,KACjB,MAAMA,EAAO,IAAI,IAAU,CACzBC,UAAW,gBACXC,kBAAkB,EAClBC,aAAc,uBACdC,gBAAiB,4BAGbC,EAAU,YAAO,iCACjBC,EAAc,IAAI,IAAKC,YAAY,CAACC,IAAK,eAE/CH,EAAQpC,OAAOqC,EAAYlC,SAE3B,MAAMK,EAAqB,IAAI,IAAmB,CAChDgC,MAAO,gBACPnD,KAAM,aAOR,IAAIoD,EAJJX,EAAgBtB,EAAmBtB,MAEnC6C,EAAKW,aAAa1C,OAAOQ,EAAmBT,UAAWqC,GAIvD,IAiBIO,EAjBAC,EAAW,KAETH,IACFA,EAAmBI,OAAOC,YAAYF,EAAU,MAGlC,IAAgBA,WAAW1B,KAAK6B,IAC9CJ,EAAQI,EAELJ,EAAMK,KACP,YAAexC,EAAmBgC,MAAO,YAAW,IAAkBS,cAAcN,EAAMK,QAE1FxC,EAAmB0C,cAOzB,MAAMC,EAAYtE,IAKhB,GAJGA,GACD,YAAYA,IAGViD,EAAczB,MAAM5D,OAEtB,YADAqF,EAAc9C,UAAUU,IAAI,SAI9B,MAAMT,EAAS,YAAiB,CAAC6C,EAAeM,IAAU,GAC1D,IAAI/B,EAAQyB,EAAczB,MAE1BgC,EAAYe,OAAO,CAACb,IAAK,eACzB,MAAMc,EAAY,YAAajB,GAE/B5B,EAAmB8C,iBAAiB,GAAKC,KAAKC,UAC9ChD,EAAmB8C,iBAAiBjD,GAEpC,IAAgBoD,MAAMpD,EAAOsC,GAAOzB,KAAMwC,IAGxC,OAAOA,EAAS3G,GACd,IAAK,qBACH4G,cAAclB,GACd,8BAAmBvB,KAAK0C,IACtBA,EAAEC,QAAQC,UAETC,GAAQA,EAAOlC,SAClB,MACF,QACEO,EAAQ4B,gBAAgB,YACxB3B,EAAYe,OAAO,CAACb,IAAKmB,EAAS3G,IAClCsG,EAAUxB,YAGboC,MAAOC,IACRjF,IACAuB,EAAmBtB,MAAMF,UAAUU,IAAI,SAEhCwE,EAAItH,KAGPyF,EAAYe,OAAO,CAACb,IAAK,0BACzBT,EAAcqC,SAIlBd,EAAUxB,SAEVe,OAIJ,YAAiBR,EAASe,GAE1BrB,EAAc7B,iBAAiB,YAAY,SAAepB,GAIxD,GAHAC,KAAKE,UAAU6C,OAAO,SACtBQ,EAAYe,OAAO,CAACb,IAAK,eAEZ,UAAV1D,EAAE0D,IACH,OAAOY,OAIX,MAAM1C,EAAO,IAAW2D,SAAW,IAAM,IACnCL,EAAS,IAAI,IAAevD,EAAoBC,GAEtD,OADAsB,EAAKsC,SAASrE,OAAO+D,EAAOhE,WACrBuE,QAAQC,IAAI,CACjBR,EAAOS,OACP5B,OAIuD,KAAM,KAE7Dd,EAAc2C,QAGhB,IAAgBC,YAAY,YAAa,CAAC3H,EAAG,wBAGhC,a,gCClJA,SAAS4H,EAAeC,EAAmB9I,GACxD,GAAoB,iBAAX,EAEP,YADA8I,EAAKC,UAAY/I,GAKnB,MAAMoC,EAAa0G,EAAK1G,WACrBA,EACE0G,EAAKE,YAAc5G,EACpBA,EAAW6G,YAAYjJ,IAEvB8I,EAAKI,YAAc,GACnBJ,EAAK5E,OAAOlE,IAGd8I,EAAK5E,OAAOlE,GAtBhB,mC,oICgBA,IAAImJ,EAAO,KACTzF,SAASS,iBAAiB,QAAUpB,IAClC,IAAI,OAAAjE,EAAA,GAAgBiE,EAAEqG,OAAQ,0BAC5B,OAIF,IAAIC,EAAchJ,EADlB0C,EAAEuG,iBAIF,IAAI1G,GAAqBG,EAAEwG,eAAiBxG,GAAGyG,cAAcC,QAAQ,cACjEC,GAAe,EAGfC,GAAgB5G,EAAEwG,eAAiBxG,GAAGyG,cAAcC,QAAQ,aAChE,GAAGE,EAAKnF,OAAQ,CACdmF,EAAOA,EAAKC,QAAQ,2BAA4B,IAChDD,EAAOA,EAAKC,QAAQ,mBAAoB,IAExC,MAAMxK,EAAQuK,EAAKvK,MAAM,2BACtBA,IACDuK,EAAOvK,EAAM,GAAGoF,QAGlB,IAAIqF,EAAoBnG,SAASC,cAAc,QAC/CkG,EAAKd,UAAYY,EAEjB,IAAIxH,EAAW0H,EAAKzH,WACpB,KAAMD,GAAU,CACd,IAAIE,EAAcF,EAASE,YACF,IAAtBF,EAAS5B,WACN4B,EAAS3B,UAAUgE,QACrBrC,EAAS4D,UAIb5D,EAAWE,EAGb,MAAMyH,EAAY,OAAAC,EAAA,GAAaF,GAAM,GACrC,GAAGC,EAAUvF,MAAMqF,QAAQ,MAAO,IAAIjJ,SAAWiC,EAAUgH,QAAQ,MAAO,IAAIjJ,OAAQ,CACpF0I,EAAOS,EAAUvF,MACjBlE,EAAWyJ,EAAUzJ,SACrBqJ,GAAe,EAEf,IAAIM,EAAY,IAAkBC,cAAcZ,GAChDW,EAAYA,EAAUE,OAAOnH,GAAa,uBAARA,EAAE9B,GAAsC,2BAAR8B,EAAE9B,GACpE,IAAkBkJ,cAAc9J,EAAU2J,IAI3CN,IACDL,EAAOzG,EACPvC,EAAW,IAAkB4J,cAAcZ,GAC3ChJ,EAAWA,EAAS6J,OAAOnH,GAAa,uBAARA,EAAE9B,GAAsC,2BAAR8B,EAAE9B,IAGpEoI,EAAO,IAAkBe,cAAcf,EAAM,CAAChJ,aAE9C0G,OAAOrD,SAAS2G,YAAY,cAAc,EAAOhB,KAGnDF,EAAO,MAoBT,IAAYmB,GAAZ,SAAYA,GACV,yBACA,qBACA,qBAHF,CAAYA,MAAU,KAuRP,IAlQf,MAeE,YAAmB5H,EAA6B,IAA7B,KAAAA,UACjBM,KAAKiB,UAAYP,SAASC,cAAc,OACxCX,KAAKiB,UAAUf,UAAUU,IAAI,eAE7BZ,KAAKuH,SAAW7H,EAAQ6H,SACxBvH,KAAKwH,SAAW9H,EAAQ8H,cAEClI,IAAtBI,EAAQ+H,gBAAoDnI,IAAzBI,EAAQgI,eAC5ChI,EAAQgI,aAAejD,KAAKkD,IAAI,GAAIlD,KAAKmD,MAAMlI,EAAQ+H,UAAY,KAGrE,MAAM,YAACI,EAAW,UAAEJ,EAAS,aAAEC,EAAY,KAAEnH,EAAI,UAAEX,EAAS,YAAEkI,GAAc,GAAQpI,EAEpF,IAEIU,EAyEA2H,EA3EArE,EAAQhE,EAAQgE,OAAShE,EAAQsI,UAGrC,GAAIpI,EA0CFI,KAAKiB,UAAU8E,UAAY,8BACNxF,EAAO,SAASA,KAAU,yBAAyBmD,EAAQ,cAAgB,wCAGhGtD,EAAQJ,KAAKiB,UAAUgH,sBA9CV,CACV9B,GACDA,IAGFnG,KAAKiB,UAAU8E,UAAY,iCACHmC,SAASJ,+CAGjC1H,EAAQJ,KAAKiB,UAAUgH,kBACvB,MAAME,EAAW,IAAIC,iBAAiB,KAGjCL,GACDA,MAKJ3H,EAAMe,iBAAiB,QAAS,KAC3B,OAAAC,EAAA,GAAahB,KACdA,EAAM2F,UAAY,IAGjB/F,KAAKqI,YACNrI,KAAKqI,UAAUtC,UAAY3F,EAAM2F,UACjC/F,KAAKsI,iBAKTH,EAASI,QAAQnI,EAAO,CAACoI,eAAe,EAAMC,WAAW,EAAMC,SAAS,IAErEhJ,EAAQiJ,UACTvI,EAAMF,UAAUU,IAAI,aAAc,gBAGlCZ,KAAKqI,UAAY3H,SAASC,cAAc,OACxCX,KAAKqI,UAAU/H,aAAa,kBAAmB,QAC/CN,KAAKqI,UAAUnF,UAAY9C,EAAM8C,UAAY,2BAqBjD,GAVA9C,EAAME,aAAa,MAAO,QAEvBuH,IACD,YAAMzH,EAAOyH,OAAavI,EAAW,eAElCU,KAAKqI,WACN,YAAMrI,KAAKqI,UAAWR,OAAavI,EAAW,gBAI/CoE,GAASmE,EAAa,CACvB,MAAMe,EAASlI,SAASC,cAAc,OACtCiI,EAAO1I,UAAUU,IAAI,sBACrBZ,KAAKiB,UAAUC,OAAO0H,GAUxB,GAPGlF,IACD1D,KAAK0D,MAAQhD,SAASC,cAAc,SACpCX,KAAKoE,WACLpE,KAAKiB,UAAUC,OAAOlB,KAAK0D,QAI1B+D,EAAW,CACZ,MAAMoB,EAAU7I,KAAKiB,UAAU6H,iBAC/B,IAAIC,GAAgB,EAEpBhB,EAAe,KACb,MAAMiB,EAAW5I,EAAMF,UAAU+I,SAAS,SAEpCC,EAActJ,EAAaQ,EAA2BmB,MAAM5D,OAAS,IAAI,OAAAoJ,EAAA,GAAa3G,GAAO,GAAOmB,OAAO5D,OAC3GwL,EAAO1B,EAAYyB,EACnBE,EAAUD,EAAO,EACvB/I,EAAMF,UAAUC,OAAO,QAASiJ,GAI7BA,GAAWD,GAAQzB,GACpB1H,KAAKoE,WACLyE,EAAQ3H,OAAO,KAAKuG,EAAYyB,MAC5BH,IAAeA,GAAgB,KAC1BC,IAAaI,GAAYL,KAClC/I,KAAKoE,WACL2E,GAAgB,IAIpB3I,EAAMe,iBAAiB,QAAS4G,GAGlC/H,KAAKI,MAAQA,EAGR,SACDJ,KAAKuB,QAINvB,KAAKN,QAAQE,UACbI,KAAKI,MAA2BiF,SClQxB,SAA+BtJ,GAC5C,MAAMsN,EAAQ3I,SAAS4I,cACvBD,EAAME,mBAAmBxN,GACzB,MAAMyN,EAAMzF,OAAO0F,eACnBD,EAAIE,kBACJF,EAAIG,SAASN,GD+PTO,CAAsB5J,KAAKI,QAIxB,WACLJ,KAAK0D,MAAMwC,YAAc,GACtBlG,KAAKN,QAAQsI,UACdhI,KAAK0D,MAAMqC,UAAY/F,KAAKN,QAAQsI,UAEpChI,KAAK0D,MAAMxC,OAAO,YAAKlB,KAAKN,QAAQgE,MAAO1D,KAAKN,QAAQmK,eAIrD,YAAYC,GAAY,GAC7B,MAAOC,aAAcC,GAAiChK,KAAKqI,UAMrD4B,GAAiBjK,KAAKI,MAAM8J,MAAMhI,OAAO0E,QAAQ,KAAM,IAC7D,GAAGqD,IAAkBD,EACnB,OAGF,MACMG,EAAqB1F,KAAKmD,MADG,GAEJnD,KAAK2F,IAAI3F,KAAK4F,IAAIL,EAAYC,KAI7DjK,KAAKI,MAAM8J,MAAMC,mBAAwBA,EAAH,KAEnCL,IACD9J,KAAKI,MAAM8J,MAAMhI,OAAS8H,EAAYA,EAAY,KAAO,IAI3D,YAAchK,KAAKI,MADD,sBACmB,EAAM+J,EAAoB,KAC7DnK,KAAKI,MAAMF,UAAU6C,OAFL,wBAMpB,YACE,OAAO/C,KAAKN,QAAQE,UAAaI,KAAKI,MAA2BmB,MAAQ,OAAAwF,EAAA,GAAa/G,KAAKI,OAAO,GAAOmB,MAI3G,UAAUA,GACRvB,KAAKwE,iBAAiBjD,GAAO,GAE7B,YAAcvB,KAAKI,MAAO,SAGrB,iBAAiBmB,EAAe+I,GAAgB,GAClDtK,KAAKN,QAAQE,UACbI,KAAKI,MAA2BmB,MAAQA,GAEzCvB,KAAKI,MAAM2F,UAAYxE,EAEpBvB,KAAKqI,YACNrI,KAAKqI,UAAUtC,UAAYxE,EAExB+I,GACDtK,KAAKsI,gBAMN,YACL,OAAOtI,KAAKuB,QAAUvB,KAAKuK,cAGtB,UACL,OAAQvK,KAAKI,MAAMF,UAAU+I,SAAS,YAClCjJ,KAAKwH,UAAYxH,KAAKwH,eACtBxH,KAAKuH,WAAa,OAAAnG,EAAA,GAAapB,KAAKI,QAGnC,kBACL,OAAOJ,KAAKwK,WAAaxK,KAAKyK,YAGzB,cAAclJ,EAAQ,GAAImJ,GAAS,GACpC1K,KAAKN,QAAQE,YACf2B,EAAQ,IAAkB6F,cAAc7F,IAGvCmJ,EACD1K,KAAKwE,iBAAiBjD,GAAO,GAE7BvB,KAAKuB,MAAQA,EAIV,iBAAiBA,EAAqC,GAAImJ,GAAS,GACxE1K,KAAKuK,cAAgBhJ,EACrBvB,KAAK2K,cAAcpJ,EAAOmJ,GAGrB,SAAS7G,EAAmBH,GAC9BA,IACD1D,KAAK0D,MAAMwC,YAAc,GACzBlG,KAAK0D,MAAMxC,OAAO,YAAKwC,EAAO1D,KAAKN,QAAQmK,gBAG7C7J,KAAKI,MAAMF,UAAUC,OAAO,WAAY0D,EAAQyD,EAAWsD,QAC3D5K,KAAKI,MAAMF,UAAUC,OAAO,WAAY0D,EAAQyD,EAAWuD,QAGtD,SAASnH,GACd1D,KAAK8K,SAASxD,EAAWsD,MAAOlH,M,gCErXpC,WAQA,MAAMqH,EAAgB,CACpB1J,EACA6B,EACA8H,EACAC,EACAC,EACAC,KAEA,MAAM,QAACC,EAAO,IAAEC,GAAOhK,EAAQhD,QAgB/B,QAfeiB,IAAZ8L,GACDE,cAAcF,QAGL9L,IAAR+L,IACDtH,OAAOwH,sBAAsBF,GACzBF,UACK9J,EAAQhD,QAAQgN,KAQxBF,GAAW,IAAUK,SAASC,mBAAqBR,EAMpD,YALA5J,EAAQhD,QAAQgN,IAAM,GAAKtH,OAAO2H,sBAAsB,YAC/CrK,EAAQhD,QAAQgN,IACvBN,EAAc1J,EAAS6B,EAAW8H,EAAUC,EAAUC,EAAiBC,EAAU,MAMlFH,GAAY9H,GACb7B,EAAQnB,UAAUU,IAAIsC,GAGxB,MAAMyI,EAAe,YACZtK,EAAQhD,QAAQ+M,SACnBJ,GAAY9H,GACd7B,EAAQnB,UAAU6C,OAAO,YAAaG,GAGxC7B,EAAQnB,UAAU6C,OAAO,aAEzBmI,GAAmBA,KAGrB,IAAI,IAAUM,SAASC,oBAAsBR,EAG3C,OAFA5J,EAAQnB,UAAU6C,OAAO,YAAa,kBACtC4I,IAIFtK,EAAQnB,UAAUU,IAAI,aAEtBS,EAAQnB,UAAUC,OAAO,aAAc6K,GACvC3J,EAAQhD,QAAQ+M,QAAU,GAAKQ,WAAWD,EAAcV,IAG3C,O,gCC9DA,SAASY,EAAiBC,EAAyBC,GAOhE,OANGA,EACDD,EAASE,QAAQjQ,GAAMA,EAAGuE,aAAa,WAAY,SAEnDwL,EAASE,QAAQjQ,GAAMA,EAAGmJ,gBAAgB,aAGrC,IAAM2G,EAAiBC,GAAWC,GAb3C,mC,kDCiHA,MAAME,EAAkB,IAjGjB,MACE,WACL,OAAO,IAAWC,UAAU,uBAAuB9J,KAAM+J,GAChDA,GAIJ,eAAeX,EAKlB,IAIF,OAAOxL,KAAK8D,WAAW1B,KAAKyB,IAC1B,IAAIuI,EACAC,EACJ,MAAMC,EAAwC,CAC5CC,SAAU,KACVC,aAAc,CACZvO,EAAG,gCACHiG,KAAMsH,EAAStH,KACfuI,MAAOjB,EAASiB,QAKlBL,EADCZ,EAASkB,gBACW,IAAWC,aAAa,aAAcnB,EAASkB,gBAAiB7I,GAAO,GAEvE2B,QAAQoH,QAAQ,CACnC3O,EAAG,4BAKP,MAAM4O,EAAUhJ,EAAMiJ,SAChBC,EAAQ,IAAIC,WAAWH,EAAQE,MAAMpP,OAAS,IAWpD,OCjES,SAA8CsP,GAC3D,IAAGC,UAAU,oBAAqBA,QAGhC,MAAM,IAAItC,MAAM,oBAFhBsC,OAAOC,gBAAgBF,GDqDrBG,CAAUL,GACVA,EAAMM,IAAIR,EAAQE,MAAO,GACzBF,EAAQE,MAAQA,EAGdV,EADCb,EAAS8B,YACO,IAAWX,aAAa,aAAcnB,EAAS8B,YAAazJ,GAAO,GAEnE2B,QAAQoH,QAAQ,IAAII,YAGhCxH,QAAQC,IAAI,CAAC2G,EAAoBC,IAAiBjK,KAAMmL,IAC7DjB,EAAOC,SAAWgB,EAAO,GACzBjB,EAAOE,aAAaM,SAAWD,EAC/BP,EAAOE,aAAagB,kBAAoBD,EAAO,GAExC,IAAWrB,UAAU,iCAAkCI,OAK7D,MAAMC,EAAkB1I,EAAwBnE,EAAe,IACpE,OAAO,IAAWiN,aAAa,aAAcJ,EAAU1I,GAAO,GAAOzB,KAAMqL,GAElE,IAAWvB,UAAU,qBAAsB,CAChDK,SAAUkB,GACT/N,GAAS0C,KAAKsL,IACD,uBAAXA,EAAKzP,GACN,IAAW0P,QAAQD,EAAKE,MAGnBF,KAKN,qBAAqBG,GAC1B,OAAO,IAAW3B,UAAU,+BAAgC,CAAC2B,SAGxD,sBACL,OAAO,IAAW3B,UAAU,+BAGvB,sBACL,OAAO,IAAWA,UAAU,iCAehC,IAAeD,gBAAkBA,EAClB,O,gCEnHf,8DAgBe,SAASlF,EAAa+G,EAAoBC,GAAe,GACtE,MAAM9Q,EAAkB,GAClBC,EAAiB,GAEjBG,EAA4B0Q,EAAe,QAAKzO,EACtD,YAAoBwO,EAAO7Q,EAAOC,OAAMoC,OAAWA,EAAWjC,GAC3DH,EAAKS,QACNV,EAAMQ,KAAKP,EAAK0B,KAAK,KAGvB,IAAI2C,EAAQtE,EAAM2B,KAAK,MAkBvB,OAjBA2C,EAAQA,EAAMqF,QAAQ,UAAW,MAE9BvJ,aAAQ,EAARA,EAAUM,UASX,IAAkBqQ,oBAAoB3Q,GACtC,IAAkB4Q,aAAa5Q,IAK1B,CAACkE,QAAOlE,YAGjB,IAAe0J,aAAeA,G,gCC/C9B,6CAQe,MAAMmH,EAQnB,YAAYxO,GAMVM,KAAKqB,QAAUX,SAASyN,KAAKC,cAAc,IAAM1O,EAAQwD,WAIzDlD,KAAKiB,UAAYP,SAASC,cAAc,OACxCX,KAAKiB,UAAUiC,UAAY,yBAE3BlD,KAAKuF,SAAW7E,SAASC,cAAc,OACvCX,KAAKuF,SAASrC,UAAY,aAE1BlD,KAAKqO,MAAQ3N,SAASC,cAAc,MACjCjB,EAAQ0D,cACTpD,KAAKqO,MAAMnN,OAAO,YAAKxB,EAAQ0D,eAGjCpD,KAAKsO,SAAW5N,SAASC,cAAc,KACvCX,KAAKsO,SAASpL,UAAY,WACvBxD,EAAQ2D,iBACTrD,KAAKsO,SAASpN,OAAO,YAAKxB,EAAQ2D,kBAGpCrD,KAAKiB,UAAUC,OAAOlB,KAAKuF,SAAUvF,KAAKqO,MAAOrO,KAAKsO,UAEnD5O,EAAQyD,mBACTnD,KAAK4D,aAAelD,SAASC,cAAc,OAC3CX,KAAK4D,aAAaV,UAAY,gBAC9BlD,KAAKiB,UAAUC,OAAOlB,KAAK4D,eAG7B5D,KAAKqB,QAAQH,OAAOlB,KAAKiB,c,gCC7Cd,SAASsN,EAAW5H,GACjC,MAAME,EAAOnG,SAASC,cAAc,QAEpC,OADAkG,EAAKd,UAAYY,EACVE,EATT","file":"12.98f15505a7862a1f5623.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\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: 'messageEntityPre'\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 as any,\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\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 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 { 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 text = RichTextProcessor.wrapDraftText(text, {entities});\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,\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 this.label.innerHTML = 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 = 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\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","/*\r\n * https://github.com/morethanwords/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) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/13.5f88e9579f7a932dfad4.chunk.js b/public/13.5f88e9579f7a932dfad4.chunk.js deleted file mode 100644 index 08d8cf38..00000000 --- a/public/13.5f88e9579f7a932dfad4.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[13,12,15],{104:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},105: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:"messageEntityPre"},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)}}},114:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(94);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},119:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(69);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()}}},139:function(t,e,i){"use strict";i.r(e);var n=i(60),s=i(61),a=i(34),o=i(92),r=i(87),l=i(57),c=i(106),u=i(119),d=i(27),h=i(7),p=i(95),m=i(32),g=i(56),b=i(96),f=i(58),v=i(76);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,107)).then(t=>{t.default.mount()}),N&&N.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,N=new u.a(r,S);return t.imageDiv.append(N.container),Promise.all([N.load(),L()])},null,()=>{y.focus(),a.c.pushToState("authState",{_:"authStatePassword"})});e.default=w},58: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}))},64:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(111),s=i(104),a=i(94),o=i(114);var r=i(7),l=i(27),c=i(72);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(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 c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));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:l,canBeEdited:c=!0}=t;let d,h,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});d.addEventListener("input",()=>{Object(o.a)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())}),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&(Object(r.b)(d,e,void 0,"placeholder"),this.inputFake&&Object(r.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;h=()=>{const s=d.classList.contains("error"),o=l?d.value.length:[...Object(a.a)(d,!1).value].length,r=i-o,c=r<0;d.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",h)}this.input=d}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?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.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(c.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(a.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(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.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(r.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},72: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},76: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}))},92: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},94:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(1),s=i(27),a=i(105);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},95: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)}}},96:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); -//# sourceMappingURL=13.5f88e9579f7a932dfad4.chunk.js.map \ No newline at end of file diff --git a/public/13.5f88e9579f7a932dfad4.chunk.js.map b/public/13.5f88e9579f7a932dfad4.chunk.js.map deleted file mode 100644 index 7e0f03a6..00000000 --- a/public/13.5f88e9579f7a932dfad4.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.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/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","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","entities","offset","nodeType","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","join","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","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","innerHTML","lastChild","replaceWith","textContent","init","target","text","preventDefault","originalEvent","clipboardData","getData","usePlainText","html","replace","span","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","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","htmlToSpan"],"mappings":"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","file":"13.5f88e9579f7a932dfad4.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\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: 'messageEntityPre'\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 as any,\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\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 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 { 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 text = RichTextProcessor.wrapDraftText(text, {entities});\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,\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 this.label.innerHTML = 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 = 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\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","/*\r\n * https://github.com/morethanwords/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) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/13.a1a0e4713c63e85c7faf.chunk.js b/public/13.a1a0e4713c63e85c7faf.chunk.js new file mode 100644 index 00000000..33615f3a --- /dev/null +++ b/public/13.a1a0e4713c63e85c7faf.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[13,12,15],{104:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},105: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)}}},114:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(94);function s(t){return t.hasAttribute("contenteditable")||"INPUT"!==t.tagName?!Object(n.a)(t,!1).value.trim():!t.value.trim()}},119:function(t,e,i){"use strict";i.d(e,"a",(function(){return s}));var n=i(69);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()}}},139:function(t,e,i){"use strict";i.r(e);var n=i(60),s=i(61),a=i(34),o=i(92),r=i(87),l=i(57),c=i(106),u=i(119),d=i(27),h=i(7),p=i(95),m=i(32),g=i(56),b=i(96),f=i(58),v=i(76);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,107)).then(t=>{t.default.mount()}),N&&N.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,N=new u.a(r,S);return t.imageDiv.append(N.container),Promise.all([N.load(),L()])},null,()=>{y.focus(),a.c.pushToState("authState",{_:"authStatePassword"})});e.default=w},58: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}))},64:function(t,e,i){"use strict";i.d(e,"a",(function(){return d}));var n=i(111),s=i(104),a=i(94),o=i(114);var r=i(7),l=i(27),c=i(72);let u=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(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 c=s.firstChild;for(;c;){let t=c.nextSibling;3===c.nodeType&&(c.nodeValue.trim()||c.remove()),c=t}const u=Object(a.a)(s,!0);if(u.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=u.value,i=u.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),u=null};var d;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(d||(d={}));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:l,canBeEdited:c=!0}=t;let d,h,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,d=this.container.firstElementChild;else{u&&u(),this.container.innerHTML=`\n
\n `,d=this.container.firstElementChild;const e=new MutationObserver(()=>{h&&h()});d.addEventListener("input",()=>{Object(o.a)(d)&&(d.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=d.innerHTML,this.onFakeInput())}),e.observe(d,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(d.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=d.className+" input-field-input-fake")}if(d.setAttribute("dir","auto"),e&&(Object(r.b)(d,e,void 0,"placeholder"),this.inputFake&&Object(r.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;h=()=>{const s=d.classList.contains("error"),o=l?d.value.length:[...Object(a.a)(d,!1).value].length,r=i-o,c=r<0;d.classList.toggle("error",c),c||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!c||e)&&(this.setLabel(),e=!1)},d.addEventListener("input",h)}this.input=d}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?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.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(c.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(a.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(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.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(r.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&d.Error)),this.input.classList.toggle("valid",!!(t&d.Valid))}setError(t){this.setState(d.Error,t)}}},72: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},76: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}))},92: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},94:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(1),s=i(27),a=i(105);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},95: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)}}},96:function(t,e,i){"use strict";function n(t){const e=document.createElement("span");return e.innerHTML=t,e}i.d(e,"a",(function(){return n}))}}]); +//# sourceMappingURL=13.a1a0e4713c63e85c7faf.chunk.js.map \ No newline at end of file diff --git a/public/13.a1a0e4713c63e85c7faf.chunk.js.map b/public/13.a1a0e4713c63e85c7faf.chunk.js.map new file mode 100644 index 00000000..45124db6 --- /dev/null +++ b/public/13.a1a0e4713c63e85c7faf.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/helpers/dom/findUpAttribute.ts","webpack:///./src/helpers/dom/getRichElementValue.ts","webpack:///./src/components/passwordInputField.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/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","webpack:///./src/helpers/dom/htmlToSpan.ts"],"names":["findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","entities","offset","nodeType","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","join","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","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","innerHTML","lastChild","replaceWith","textContent","init","target","text","preventDefault","originalEvent","clipboardData","getData","usePlainText","html","replace","span","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","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","htmlToSpan"],"mappings":"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","file":"13.a1a0e4713c63e85c7faf.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\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\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 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 { 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 text = RichTextProcessor.wrapDraftText(text, {entities});\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,\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 this.label.innerHTML = 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 = 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\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","/*\r\n * https://github.com/morethanwords/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) {\r\n const span = document.createElement('span');\r\n span.innerHTML = html;\r\n return span;\r\n}\r\n"],"sourceRoot":""} \ No newline at end of file diff --git a/public/14.d15027c531ca1671a9e3.chunk.js b/public/14.0c3a1ae74a0c65edf059.chunk.js similarity index 97% rename from public/14.d15027c531ca1671a9e3.chunk.js rename to public/14.0c3a1ae74a0c65edf059.chunk.js index 243e02d7..617c29a9 100644 --- a/public/14.d15027c531ca1671a9e3.chunk.js +++ b/public/14.0c3a1ae74a0c65edf059.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[14,16,17,18],{115: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}))},116: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)})})}},129:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(69);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()}}},130:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(64);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})}}},160:function(e,t,n){"use strict";n.r(t);var i=n(8),a=n(87),o=n(85),s=n(5),r=n(57),l=n(7),c=n(34),d=n(0),u=n(60),h=n(122),p=n(16),m=n(115),g=n(116);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,163)).then(e=>e.default.mount()),S=!0});const O=(yield Promise.all([n.e(10).then(n.t.bind(null,196,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,107)).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(13).then(n.bind(null,139)).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},165:function(e,t,n){"use strict";n.r(t);var i=n(61),a=n(34),o=n(8),s=n(87),r=n(163),l=n(129),c=n(130),d=n(7),u=n(21),h=n(58),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,107)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(20)]).then(n.bind(null,152)).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,139))).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},85: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.d15027c531ca1671a9e3.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[14,16,17,18],{115: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}))},116: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)})})}},129:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(69);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()}}},130:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(64);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})}}},161:function(e,t,n){"use strict";n.r(t);var i=n(8),a=n(87),o=n(85),s=n(5),r=n(57),l=n(7),c=n(34),d=n(0),u=n(60),h=n(122),p=n(16),m=n(115),g=n(116);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,164)).then(e=>e.default.mount()),S=!0});const O=(yield Promise.all([n.e(10).then(n.t.bind(null,196,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,107)).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(13).then(n.bind(null,139)).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},166:function(e,t,n){"use strict";n.r(t);var i=n(61),a=n(34),o=n(8),s=n(87),r=n(164),l=n(129),c=n(130),d=n(7),u=n(21),h=n(58),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,107)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(20)]).then(n.bind(null,152)).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,139))).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},85: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.0c3a1ae74a0c65edf059.chunk.js.map \ No newline at end of file diff --git a/public/14.d15027c531ca1671a9e3.chunk.js.map b/public/14.0c3a1ae74a0c65edf059.chunk.js.map similarity index 99% rename from public/14.d15027c531ca1671a9e3.chunk.js.map rename to public/14.0c3a1ae74a0c65edf059.chunk.js.map index 38fc3f72..64d2bd71 100644 --- a/public/14.d15027c531ca1671a9e3.chunk.js.map +++ b/public/14.0c3a1ae74a0c65edf059.chunk.js.map @@ -1 +1 @@ -{"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.d15027c531ca1671a9e3.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 +{"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.0c3a1ae74a0c65edf059.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/16.1163d3ba587800ecae20.chunk.js b/public/16.049af2cb2d7656888f47.chunk.js similarity index 96% rename from public/16.1163d3ba587800ecae20.chunk.js rename to public/16.049af2cb2d7656888f47.chunk.js index aeca28ea..a0ac2fd1 100644 --- a/public/16.1163d3ba587800ecae20.chunk.js +++ b/public/16.049af2cb2d7656888f47.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[16,17],{115: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}))},116: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)})})}},160:function(e,t,n){"use strict";n.r(t);var r=n(8),a=n(87),i=n(85),o=n(5),s=n(57),c=n(7),l=n(34),d=n(0),u=n(60),g=n(122),p=n(16),f=n(115),m=n(116);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,163)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,196,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,107)).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(13).then(n.bind(null,139)).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},85: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.1163d3ba587800ecae20.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[16,17],{115: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}))},116: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)})})}},161:function(e,t,n){"use strict";n.r(t);var r=n(8),a=n(87),i=n(85),o=n(5),s=n(57),c=n(7),l=n(34),d=n(0),u=n(60),g=n(122),p=n(16),f=n(115),m=n(116);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,164)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,196,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,107)).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(13).then(n.bind(null,139)).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},85: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.049af2cb2d7656888f47.chunk.js.map \ No newline at end of file diff --git a/public/17.f7254c2398a46332f31d.chunk.js.map b/public/16.049af2cb2d7656888f47.chunk.js.map similarity index 99% rename from public/17.f7254c2398a46332f31d.chunk.js.map rename to public/16.049af2cb2d7656888f47.chunk.js.map index 8957cbd9..32dc7008 100644 --- a/public/17.f7254c2398a46332f31d.chunk.js.map +++ b/public/16.049af2cb2d7656888f47.chunk.js.map @@ -1 +1 @@ -{"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":"17.f7254c2398a46332f31d.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 +{"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.049af2cb2d7656888f47.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.f7254c2398a46332f31d.chunk.js b/public/17.d520b3312c59a122ae5d.chunk.js similarity index 96% rename from public/17.f7254c2398a46332f31d.chunk.js rename to public/17.d520b3312c59a122ae5d.chunk.js index 810e0e9b..71a353b0 100644 --- a/public/17.f7254c2398a46332f31d.chunk.js +++ b/public/17.d520b3312c59a122ae5d.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[17,16],{115: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}))},116: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)})})}},160:function(e,t,n){"use strict";n.r(t);var r=n(8),a=n(87),i=n(85),o=n(5),s=n(57),c=n(7),l=n(34),d=n(0),u=n(60),g=n(122),p=n(16),f=n(115),m=n(116);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,163)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,196,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,107)).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(13).then(n.bind(null,139)).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},85: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.f7254c2398a46332f31d.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[17,16],{115: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}))},116: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)})})}},161:function(e,t,n){"use strict";n.r(t);var r=n(8),a=n(87),i=n(85),o=n(5),s=n(57),c=n(7),l=n(34),d=n(0),u=n(60),g=n(122),p=n(16),f=n(115),m=n(116);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,164)).then(e=>e.default.mount()),L=!0});const E=(yield Promise.all([n.e(10).then(n.t.bind(null,196,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,107)).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(13).then(n.bind(null,139)).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},85: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.d520b3312c59a122ae5d.chunk.js.map \ No newline at end of file diff --git a/public/16.1163d3ba587800ecae20.chunk.js.map b/public/17.d520b3312c59a122ae5d.chunk.js.map similarity index 99% rename from public/16.1163d3ba587800ecae20.chunk.js.map rename to public/17.d520b3312c59a122ae5d.chunk.js.map index 185bac97..bc899a89 100644 --- a/public/16.1163d3ba587800ecae20.chunk.js.map +++ b/public/17.d520b3312c59a122ae5d.chunk.js.map @@ -1 +1 @@ -{"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.1163d3ba587800ecae20.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 +{"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.d520b3312c59a122ae5d.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.045ea4aeee8c09bb86f6.chunk.js b/public/18.db688e1ac83bd1339811.chunk.js similarity index 96% rename from public/18.045ea4aeee8c09bb86f6.chunk.js rename to public/18.db688e1ac83bd1339811.chunk.js index 41cf65dc..1bebdf02 100644 --- a/public/18.045ea4aeee8c09bb86f6.chunk.js +++ b/public/18.db688e1ac83bd1339811.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[18],{129:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(69);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()}}},130:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(64);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(61),a=n(34),s=n(8),o=n(87),l=n(163),r=n(129),h=n(130),u=n(7),d=n(21),c=n(58),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,107)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(20)]).then(n.bind(null,152)).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,139))).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.045ea4aeee8c09bb86f6.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[18],{129:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(69);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()}}},130:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var i=n(64);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})}}},166:function(e,t,n){"use strict";n.r(t);var i=n(61),a=n(34),s=n(8),o=n(87),l=n(164),r=n(129),h=n(130),u=n(7),d=n(21),c=n(58),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,107)).then(e=>{e.default.mount()}),a();break;case"auth.authorizationSignUpRequired":Promise.all([n.e(5),n.e(20)]).then(n.bind(null,152)).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,139))).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.db688e1ac83bd1339811.chunk.js.map \ No newline at end of file diff --git a/public/18.045ea4aeee8c09bb86f6.chunk.js.map b/public/18.db688e1ac83bd1339811.chunk.js.map similarity index 98% rename from public/18.045ea4aeee8c09bb86f6.chunk.js.map rename to public/18.db688e1ac83bd1339811.chunk.js.map index c2716478..843372ea 100644 --- a/public/18.045ea4aeee8c09bb86f6.chunk.js.map +++ b/public/18.db688e1ac83bd1339811.chunk.js.map @@ -1 +1 @@ -{"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.045ea4aeee8c09bb86f6.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 +{"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.db688e1ac83bd1339811.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/2.67fe5109f1ffeaa937f9.chunk.js b/public/2.67fe5109f1ffeaa937f9.chunk.js deleted file mode 100644 index ad6384a8..00000000 --- a/public/2.67fe5109f1ffeaa937f9.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[2],{104:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},105: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:"messageEntityPre"},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,u={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: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&&i.length)e.push(i.join("")),i.splice(0,i.length),++u.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),u.offset+=e.length)}c&&!r&&i.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,i,o,r,l,u),m=m.nextSibling;if(c&&r&&i.push(""),d&&t.nextSibling&&(i.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;n.set(t,e)})),truncate:()=>{n=new Uint8Array},trim:t=>{n=n.slice(0,t)},finalize:(e=!0)=>{const a=Object(s.a)(n,t);return e&&i&&i(a),a},getParts:()=>n,replaceParts:t=>{n=t}}}},r=function(t,e,i,n){return new(i||(i=Promise))((function(s,a){function o(t){try{l(n.next(t))}catch(t){a(t)}}function r(t){try{l(n.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,r)}l((n=n.apply(t,e||[])).next())}))};class l{constructor(t){this.dbName=t,this.useStorage=!0,n.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(i=>i.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 i=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(t,i).then(()=>e)}timeoutOperation(t){return this.useStorage?new Promise((e,i)=>r(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{i(),n=!0},15e3);try{const i=yield this.openDatabase();if(!i)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield t(i);if(n)return;e(s)}catch(t){i(t)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(t,e,i){const n=o.getFakeFileWriter(i,e,e=>this.saveFile(t,e).catch(()=>e));return Promise.resolve(n)}static toggleStorage(t){return Promise.all(this.STORAGES.map(e=>{if(e.useStorage=t,!t)return e.deleteAll()}))}}l.STORAGES=[]},58: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}))},64:function(t,e,i){"use strict";i.d(e,"a",(function(){return h}));var n=i(111),s=i(104),a=i(94),o=i(114);var r=i(7),l=i(27),u=i(72);let c=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(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 u=s.firstChild;for(;u;){let t=u.nextSibling;3===u.nodeType&&(u.nodeValue.trim()||u.remove()),u=t}const c=Object(a.a)(s,!0);if(c.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=c.value,i=c.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),c=null};var h;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(h||(h={}));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:l,canBeEdited:u=!0}=t;let h,d,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,h=this.container.firstElementChild;else{c&&c(),this.container.innerHTML=`\n
\n `,h=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});h.addEventListener("input",()=>{Object(o.a)(h)&&(h.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=h.innerHTML,this.onFakeInput())}),e.observe(h,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(h.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=h.className+" input-field-input-fake")}if(h.setAttribute("dir","auto"),e&&(Object(r.b)(h,e,void 0,"placeholder"),this.inputFake&&Object(r.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=h.classList.contains("error"),o=l?h.value.length:[...Object(a.a)(h,!1).value].length,r=i-o,u=r<0;h.classList.toggle("error",u),u||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},h.addEventListener("input",d)}this.input=h}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?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.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(u.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(a.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(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.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(r.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&h.Error)),this.input.classList.toggle("valid",!!(t&h.Valid))}setError(t){this.setState(h.Error,t)}}},72:function(t,e,i){"use strict";var n=i(0);const s=(t,e,i,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&&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 c=()=>{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 c();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(c,a)};e.a=s},94:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(1),s=i(27),a=i(105);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}}]); -//# sourceMappingURL=2.67fe5109f1ffeaa937f9.chunk.js.map \ No newline at end of file diff --git a/public/2.67fe5109f1ffeaa937f9.chunk.js.map b/public/2.67fe5109f1ffeaa937f9.chunk.js.map deleted file mode 100644 index 413bc5fd..00000000 --- a/public/2.67fe5109f1ffeaa937f9.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["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/components/singleTransition.ts","webpack:///./src/helpers/dom/getRichValue.ts"],"names":["findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","entities","offset","nodeType","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","join","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","map","storage","deleteAll","replaceContent","elem","innerHTML","lastChild","replaceWith","textContent","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","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.67fe5109f1ffeaa937f9.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\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: 'messageEntityPre'\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 as any,\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 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 { 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 text = RichTextProcessor.wrapDraftText(text, {entities});\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,\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 this.label.innerHTML = 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 = 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\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/2.9ab0343c05ba5c67500b.chunk.js b/public/2.9ab0343c05ba5c67500b.chunk.js new file mode 100644 index 00000000..d38b5c6b --- /dev/null +++ b/public/2.9ab0343c05ba5c67500b.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[2],{104:function(t,e,i){"use strict";function n(t,e){return t.closest(`[${e}]`)}i.d(e,"a",(function(){return n}))},105: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,u={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: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&&i.length)e.push(i.join("")),i.splice(0,i.length),++u.offset;else if(t instanceof HTMLImageElement){const e=t.alt;e&&(i.push(e),u.offset+=e.length)}c&&!r&&i.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,i,o,r,l,u),m=m.nextSibling;if(c&&r&&i.push(""),d&&t.nextSibling&&(i.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;n.set(t,e)})),truncate:()=>{n=new Uint8Array},trim:t=>{n=n.slice(0,t)},finalize:(e=!0)=>{const a=Object(s.a)(n,t);return e&&i&&i(a),a},getParts:()=>n,replaceParts:t=>{n=t}}}},r=function(t,e,i,n){return new(i||(i=Promise))((function(s,a){function o(t){try{l(n.next(t))}catch(t){a(t)}}function r(t){try{l(n.throw(t))}catch(t){a(t)}}function l(t){var e;t.done?s(t.value):(e=t.value,e instanceof i?e:new i((function(t){t(e)}))).then(o,r)}l((n=n.apply(t,e||[])).next())}))};class l{constructor(t){this.dbName=t,this.useStorage=!0,n.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(i=>i.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 i=new Response(e,{headers:{"Content-Length":""+e.size}});return this.save(t,i).then(()=>e)}timeoutOperation(t){return this.useStorage?new Promise((e,i)=>r(this,void 0,void 0,(function*(){let n=!1;const s=setTimeout(()=>{i(),n=!0},15e3);try{const i=yield this.openDatabase();if(!i)throw this.useStorage=!1,this.openDbPromise=void 0,"no cache?";const s=yield t(i);if(n)return;e(s)}catch(t){i(t)}clearTimeout(s)}))):Promise.reject("STORAGE_OFFLINE")}getFileWriter(t,e,i){const n=o.getFakeFileWriter(i,e,e=>this.saveFile(t,e).catch(()=>e));return Promise.resolve(n)}static toggleStorage(t){return Promise.all(this.STORAGES.map(e=>{if(e.useStorage=t,!t)return e.deleteAll()}))}}l.STORAGES=[]},58: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}))},64:function(t,e,i){"use strict";i.d(e,"a",(function(){return h}));var n=i(111),s=i(104),a=i(94),o=i(114);var r=i(7),l=i(27),u=i(72);let c=()=>{document.addEventListener("paste",t=>{if(!Object(s.a)(t.target,'contenteditable="true"'))return;let e,i;t.preventDefault();let n=(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 u=s.firstChild;for(;u;){let t=u.nextSibling;3===u.nodeType&&(u.nodeValue.trim()||u.remove()),u=t}const c=Object(a.a)(s,!0);if(c.value.replace(/\s/g,"").length===n.replace(/\s/g,"").length){e=c.value,i=c.entities,o=!1;let t=l.b.parseEntities(e);t=t.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._),l.b.mergeEntities(i,t)}}o&&(e=n,i=l.b.parseEntities(e),i=i.filter(t=>"messageEntityEmoji"===t._||"messageEntityLinebreak"===t._)),e=l.b.wrapDraftText(e,{entities:i}),window.document.execCommand("insertHTML",!1,e)}),c=null};var h;!function(t){t[t.Neutral=0]="Neutral",t[t.Valid=1]="Valid",t[t.Error=2]="Error"}(h||(h={}));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:l,canBeEdited:u=!0}=t;let h,d,p=t.label||t.labelText;if(l)this.container.innerHTML=`\n \n `,h=this.container.firstElementChild;else{c&&c(),this.container.innerHTML=`\n
\n `,h=this.container.firstElementChild;const e=new MutationObserver(()=>{d&&d()});h.addEventListener("input",()=>{Object(o.a)(h)&&(h.innerHTML=""),this.inputFake&&(this.inputFake.innerHTML=h.innerHTML,this.onFakeInput())}),e.observe(h,{characterData:!0,childList:!0,subtree:!0}),t.animate&&(h.classList.add("scrollable","scrollable-y"),this.inputFake=document.createElement("div"),this.inputFake.setAttribute("contenteditable","true"),this.inputFake.className=h.className+" input-field-input-fake")}if(h.setAttribute("dir","auto"),e&&(Object(r.b)(h,e,void 0,"placeholder"),this.inputFake&&Object(r.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=h.classList.contains("error"),o=l?h.value.length:[...Object(a.a)(h,!1).value].length,r=i-o,u=r<0;h.classList.toggle("error",u),u||r<=n?(this.setLabel(),t.append(` (${i-o})`),e||(e=!0)):(s&&!u||e)&&(this.setLabel(),e=!1)},h.addEventListener("input",d)}this.input=h}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?this.label.innerHTML=this.options.labelText:this.label.append(Object(r.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(u.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(a.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(o.a)(this.input))}isValidToChange(){return this.isValid()&&this.isChanged()}setDraftValue(t="",e=!1){this.options.plainText||(t=l.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(r.d)(e,this.options.labelOptions))),this.input.classList.toggle("error",!!(t&h.Error)),this.input.classList.toggle("valid",!!(t&h.Valid))}setError(t){this.setState(h.Error,t)}}},72:function(t,e,i){"use strict";var n=i(0);const s=(t,e,i,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&&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 c=()=>{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 c();t.classList.add("animating"),t.classList.toggle("backwards",!i),t.dataset.timeout=""+setTimeout(c,a)};e.a=s},94:function(t,e,i){"use strict";i.d(e,"a",(function(){return o}));var n=i(1),s=i(27),a=i(105);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}}]); +//# sourceMappingURL=2.9ab0343c05ba5c67500b.chunk.js.map \ No newline at end of file diff --git a/public/2.9ab0343c05ba5c67500b.chunk.js.map b/public/2.9ab0343c05ba5c67500b.chunk.js.map new file mode 100644 index 00000000..c35c052c --- /dev/null +++ b/public/2.9ab0343c05ba5c67500b.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["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/components/singleTransition.ts","webpack:///./src/helpers/dom/getRichValue.ts"],"names":["findUpAttribute","el","attribute","closest","markdownTags","bold","match","entityName","underline","italic","monospace","strikethrough","link","mentionName","spoiler","BLOCK_TAG_NAMES","Set","getRichElementValue","node","lines","line","selNode","selOffset","entities","offset","nodeType","nodeValue","push","substr","length","parentNode","parentElement","type","tag","getAttribute","_","url","href","user_id","dataset","follow","toUserId","isSelected","isBlock","has","tagName","join","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","map","storage","deleteAll","replaceContent","elem","innerHTML","lastChild","replaceWith","textContent","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","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.9ab0343c05ba5c67500b.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\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 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 { 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 text = RichTextProcessor.wrapDraftText(text, {entities});\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,\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 this.label.innerHTML = 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 = 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\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/4.91c33794543af8f50348.chunk.js b/public/4.3e09949378470770bf73.chunk.js similarity index 97% rename from public/4.91c33794543af8f50348.chunk.js rename to public/4.3e09949378470770bf73.chunk.js index a6741845..d16d70a2 100644 --- a/public/4.91c33794543af8f50348.chunk.js +++ b/public/4.3e09949378470770bf73.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[4],{117: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()}}},118: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}}},151:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var s=n(117),i=n(118),o=n(2),c=n(64);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})}}},163:function(e,t,n){"use strict";n.r(t);var s=n(60),i=n(65),o=n(34),c=n(8),a=n(27),r=n(87),l=n(64),d=n(68),h=n(57),u=n(101),p=n(14),m=n(5),g=n(7),f=n(69),b=n(75),v=n(82),L=n(33),y=n(21),S=n(12),E=n(184),w=n(160),k=n(122),x=n(32),O=n(56),j=n(58),A=n(76),T=n(6),_=n(117),P=n(28),C=n(111),H=n(11),M=n(0),N=n(151),V=n(23),D=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 I,R=null;const B=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(),M.a.addEventListener("language_change",()=>{e()});const r=new Map;let b,K;const F=document.createElement("div");F.classList.add("input-wrapper");const U=new l.b({label:"Login.CountrySelectorLabel",name:Object(y.b)()});U.container.classList.add("input-select");const W=U.input,z=document.createElement("div");z.classList.add("select-wrapper","z-depth-3","hide");const X=document.createElement("span");X.classList.add("arrow","arrow-down"),U.container.append(X);const q=document.createElement("ul");z.appendChild(q);new i.b(z);let J=()=>{J=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(V.a){const e=document.createElement("span");e.innerHTML=o,i.append(e)}else i.innerHTML=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),q.append(i)}),r.set(e.iso2,n)}),q.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(v.a)(e.target,"LI");Q(t)}),U.container.appendChild(z)};const Q=e=>{const n=e.childNodes[1].dataset.defaultName,s=e.querySelector(".phone-code").innerText,i=s.replace(/\D/g,"");Object(j.a)(W,Object(g.d)(n)),Object(C.a)(W,"input"),b=t.find(e=>e.default_name===n),K=b.country_codes.find(e=>e.country_code===i),ee.value=ee.lastValue=s,Z(),setTimeout(()=>{te.focus(),Object(_.a)(te,!0)},0)};let Y;J(),W.addEventListener("focus",(function(e){J?J():t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(Y),Y=void 0,z.classList.remove("hide"),z.offsetWidth,z.classList.add("active"),U.select(),Object(u.b)({container:B.pageEl.parentElement.parentElement,element:W,position:"start",margin:4}),setTimeout(()=>{$||(document.addEventListener("mousedown",G,{capture:!0}),$=!0)},0)}));let $=!1;const G=e=>{Object(L.a)(e.target,"input-select")||e.target!==W&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),$=!1)},Z=()=>{void 0===Y&&(z.classList.remove("active"),Y=window.setTimeout(()=>{z.classList.add("hide"),Y=void 0},200))};W.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let s=U.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&&Q(r.get(i[0].iso2)[0])}),X.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),W.matches(":focus")?W.blur():W.focus()}));const ee=new N.a({onInput:e=>{f.a.loadLottieWorkers();const{country:t,code:n}=e||{};let s=t?t.name||t.default_name:"";s===U.value||b&&t&&n&&(b===t||K.country_code===n.country_code)||(Object(j.a)(W,t?Object(g.d)(t.default_name):s),b=t,K=n),t||ee.value.length-1>1?R.style.visibility="":R.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!R.style.visibility&&"Enter"===e.key)return se()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.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()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),R=Object(h.a)("btn-primary btn-color-primary",{text:"Login.Next"}),R.style.visibility="hidden";const se=e=>{e&&Object(x.a)(e);const t=Object(A.a)([R,I],!0);Object(j.a)(R,Object(g.d)("PleaseWait")),Object(s.f)(R);let i=ee.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,165)).then(t=>t.default.mount(Object.assign(e,{phone_number:i})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(j.a)(ee.label,Object(g.d)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(j.a)(R,Object(g.d)("Login.Next"));break;default:console.error("auth.sendCode error:",e),R.innerText=e.type}})};Object(O.b)(R,se),I=Object(h.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});I.addEventListener("click",()=>{w.default.mount()}),F.append(U.container,ee.container,ne.label,R,I);const ie=document.createElement("h4");ie.classList.add("text-center"),Object(g.b)(ie,"Login.Title");const oe=document.createElement("div");oe.classList.add("subtitle","text-center"),Object(g.b)(oe,"Login.StartText"),B.pageEl.querySelector(".container").append(ie,oe,F);p.a||setTimeout(()=>{te.focus()},0),Object(k.a)(F),c.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=H.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)(te,"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=()=>D(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=>{U.value.length||ee.value.length||Q(r.get(e.country)[0])})},()=>{R&&(Object(j.a)(R,Object(g.d)("Login.Next")),Object(b.a)(R,void 0,void 0,!0),R.removeAttribute("disabled")),I&&I.removeAttribute("disabled"),o.c.pushToState("authState",{_:"authStateSignIn"})});t.default=B},65: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(101),c=n(91),a=n(32);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"}}},68:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var s=n(34),i=n(75),o=n(7),c=n(44);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)}}},76: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}))},82:function(e,t,n){"use strict";function s(e,t){return e.closest(t)}n.d(t,"a",(function(){return s}))}}]); -//# sourceMappingURL=4.91c33794543af8f50348.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[4],{117: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()}}},118: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}}},151:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var s=n(117),i=n(118),o=n(2),c=n(64);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})}}},164:function(e,t,n){"use strict";n.r(t);var s=n(60),i=n(65),o=n(34),c=n(8),a=n(27),r=n(87),l=n(64),d=n(68),h=n(57),u=n(101),p=n(14),m=n(5),g=n(7),f=n(69),b=n(75),v=n(83),L=n(33),y=n(21),S=n(12),E=n(184),w=n(161),k=n(122),x=n(32),O=n(56),j=n(58),A=n(76),T=n(6),_=n(117),P=n(28),C=n(111),H=n(11),M=n(0),N=n(151),V=n(23),D=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 I,R=null;const B=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(),M.a.addEventListener("language_change",()=>{e()});const r=new Map;let b,K;const F=document.createElement("div");F.classList.add("input-wrapper");const U=new l.b({label:"Login.CountrySelectorLabel",name:Object(y.b)()});U.container.classList.add("input-select");const W=U.input,z=document.createElement("div");z.classList.add("select-wrapper","z-depth-3","hide");const X=document.createElement("span");X.classList.add("arrow","arrow-down"),U.container.append(X);const q=document.createElement("ul");z.appendChild(q);new i.b(z);let J=()=>{J=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(V.a){const e=document.createElement("span");e.innerHTML=o,i.append(e)}else i.innerHTML=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),q.append(i)}),r.set(e.iso2,n)}),q.addEventListener("mousedown",e=>{if(0!==e.button)return;const t=Object(v.a)(e.target,"LI");Q(t)}),U.container.appendChild(z)};const Q=e=>{const n=e.childNodes[1].dataset.defaultName,s=e.querySelector(".phone-code").innerText,i=s.replace(/\D/g,"");Object(j.a)(W,Object(g.d)(n)),Object(C.a)(W,"input"),b=t.find(e=>e.default_name===n),K=b.country_codes.find(e=>e.country_code===i),ee.value=ee.lastValue=s,Z(),setTimeout(()=>{te.focus(),Object(_.a)(te,!0)},0)};let Y;J(),W.addEventListener("focus",(function(e){J?J():t.forEach(e=>{r.get(e.iso2).forEach(e=>e.style.display="")}),clearTimeout(Y),Y=void 0,z.classList.remove("hide"),z.offsetWidth,z.classList.add("active"),U.select(),Object(u.b)({container:B.pageEl.parentElement.parentElement,element:W,position:"start",margin:4}),setTimeout(()=>{$||(document.addEventListener("mousedown",G,{capture:!0}),$=!0)},0)}));let $=!1;const G=e=>{Object(L.a)(e.target,"input-select")||e.target!==W&&(Z(),document.removeEventListener("mousedown",G,{capture:!0}),$=!1)},Z=()=>{void 0===Y&&(z.classList.remove("active"),Y=window.setTimeout(()=>{z.classList.add("hide"),Y=void 0},200))};W.addEventListener("keyup",e=>{const n=e.key;if(e.ctrlKey||"Control"===n)return!1;let s=U.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&&Q(r.get(i[0].iso2)[0])}),X.addEventListener("mousedown",(function(e){e.cancelBubble=!0,e.preventDefault(),W.matches(":focus")?W.blur():W.focus()}));const ee=new N.a({onInput:e=>{f.a.loadLottieWorkers();const{country:t,code:n}=e||{};let s=t?t.name||t.default_name:"";s===U.value||b&&t&&n&&(b===t||K.country_code===n.country_code)||(Object(j.a)(W,t?Object(g.d)(t.default_name):s),b=t,K=n),t||ee.value.length-1>1?R.style.visibility="":R.style.visibility="hidden"}}),te=ee.input;te.addEventListener("keypress",e=>{if(!R.style.visibility&&"Enter"===e.key)return se()});const ne=new d.a({text:"Login.KeepSigned",name:"keepSession",withRipple:!0,checked:!0});ne.input.addEventListener("change",()=>{const e=ne.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()?ne.checked=e.keepSigned:(ne.checked=!1,ne.label.classList.add("checkbox-disabled"))}),R=Object(h.a)("btn-primary btn-color-primary",{text:"Login.Next"}),R.style.visibility="hidden";const se=e=>{e&&Object(x.a)(e);const t=Object(A.a)([R,I],!0);Object(j.a)(R,Object(g.d)("PleaseWait")),Object(s.f)(R);let i=ee.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,166)).then(t=>t.default.mount(Object.assign(e,{phone_number:i})))}).catch(e=>{switch(t(),e.type){case"PHONE_NUMBER_INVALID":ee.setError(),Object(j.a)(ee.label,Object(g.d)("Login.PhoneLabelInvalid")),te.classList.add("error"),Object(j.a)(R,Object(g.d)("Login.Next"));break;default:console.error("auth.sendCode error:",e),R.innerText=e.type}})};Object(O.b)(R,se),I=Object(h.a)("btn-primary btn-secondary btn-primary-transparent primary",{text:"Login.QR.Login"});I.addEventListener("click",()=>{w.default.mount()}),F.append(U.container,ee.container,ne.label,R,I);const ie=document.createElement("h4");ie.classList.add("text-center"),Object(g.b)(ie,"Login.Title");const oe=document.createElement("div");oe.classList.add("subtitle","text-center"),Object(g.b)(oe,"Login.StartText"),B.pageEl.querySelector(".container").append(ie,oe,F);p.a||setTimeout(()=>{te.focus()},0),Object(k.a)(F),c.a.invokeApi("help.getNearestDc").then(e=>{var t;const n=H.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)(te,"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=()=>D(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=>{U.value.length||ee.value.length||Q(r.get(e.country)[0])})},()=>{R&&(Object(j.a)(R,Object(g.d)("Login.Next")),Object(b.a)(R,void 0,void 0,!0),R.removeAttribute("disabled")),I&&I.removeAttribute("disabled"),o.c.pushToState("authState",{_:"authStateSignIn"})});t.default=B},65: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(101),c=n(91),a=n(32);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"}}},68:function(e,t,n){"use strict";n.d(t,"a",(function(){return a}));var s=n(34),i=n(75),o=n(7),c=n(44);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)}}},76: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}))},83:function(e,t,n){"use strict";function s(e,t){return e.closest(t)}n.d(t,"a",(function(){return s}))}}]); +//# sourceMappingURL=4.3e09949378470770bf73.chunk.js.map \ No newline at end of file diff --git a/public/4.91c33794543af8f50348.chunk.js.map b/public/4.3e09949378470770bf73.chunk.js.map similarity index 99% rename from public/4.91c33794543af8f50348.chunk.js.map rename to public/4.3e09949378470770bf73.chunk.js.map index 54b4f806..f1252df3 100644 --- a/public/4.91c33794543af8f50348.chunk.js.map +++ b/public/4.3e09949378470770bf73.chunk.js.map @@ -1 +1 @@ -{"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","innerHTML","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.91c33794543af8f50348.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\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 spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = 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 +{"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","innerHTML","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.3e09949378470770bf73.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\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 spanEmoji.innerHTML = wrapped;\r\n li.append(spanEmoji);\r\n } else {\r\n li.innerHTML = 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/5.8ea7ea01378265598d5f.chunk.js b/public/5.73d599f377c00cd66014.chunk.js similarity index 98% rename from public/5.8ea7ea01378265598d5f.chunk.js rename to public/5.73d599f377c00cd66014.chunk.js index 72058a7a..024d0c9a 100644 --- a/public/5.8ea7ea01378265598d5f.chunk.js +++ b/public/5.73d599f377c00cd66014.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[5],{123: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}))},140: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))}},148:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var o=n(88);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(71),r=n(7),a=n(56),c=n(186);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)}}},166: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}},186: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}))},71: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(75),s=n(79),r=n(84),a=n(7),c=n(33),l=n(37),d=n(83),h=n(56),u=n(166),m=n(32),p=n(15),f=n(123),v=n(74);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)})}}},88:function(e,t,n){"use strict";var o=n(0),i=n(8),s=n(10),r=n(140),a=n(184),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.8ea7ea01378265598d5f.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[5],{123: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}))},140: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))}},148:function(e,t,n){"use strict";n.d(t,"a",(function(){return l}));var o=n(88);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(71),r=n(7),a=n(56),c=n(186);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)}}},167: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}},186: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}))},71: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(75),s=n(79),r=n(84),a=n(7),c=n(33),l=n(37),d=n(81),h=n(56),u=n(167),m=n(32),p=n(15),f=n(123),v=n(74);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)},81: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)})}}},88:function(e,t,n){"use strict";var o=n(0),i=n(8),s=n(10),r=n(140),a=n(184),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.73d599f377c00cd66014.chunk.js.map \ No newline at end of file diff --git a/public/5.8ea7ea01378265598d5f.chunk.js.map b/public/5.73d599f377c00cd66014.chunk.js.map similarity index 99% rename from public/5.8ea7ea01378265598d5f.chunk.js.map rename to public/5.73d599f377c00cd66014.chunk.js.map index 710e0e27..d5060522 100644 --- a/public/5.8ea7ea01378265598d5f.chunk.js.map +++ b/public/5.73d599f377c00cd66014.chunk.js.map @@ -1 +1 @@ -{"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.8ea7ea01378265598d5f.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 +{"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.73d599f377c00cd66014.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/6.7ffd20da266d386fcaec.chunk.js b/public/6.7ffd20da266d386fcaec.chunk.js deleted file mode 100644 index 06369f3b..00000000 --- a/public/6.7ffd20da266d386fcaec.chunk.js +++ /dev/null @@ -1,2 +0,0 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[6],Array(59).concat([function(e,t,s){"use strict";var i=s(1),a=s(167),n=s(38),r=s(74),o=s(10),d=s(149);function c(e){return e&&e.toLowerCase()||""}var l=s(36),h=s(118),u=s(19),p=s(120),g=s(43),f=s(7),m=s(8),v=s(20),_=s(85),y=s(27),I=s(0),P=s(131),M=s(77),S=s(66),b=s(62),w=s(34);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),S.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&&M.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.initials&&void 0!==n.sortName&&n.first_name===e.first_name&&n.last_name===e.last_name)e.sortName=n.sortName,e.initials=n.initials;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":Object(d.b)(t,!1),e.initials=y.a.getAbbreviation(t)}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]||{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.d:s="Peer.RepliesNotifications";break;case v.e: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.d}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(M.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),S.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),S.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=>(M.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),S.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=>{M.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=>{M.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(27),n=s(0),r=s(66),o=s(59),d=s(7),c=s(20),l=s(43),h=s(19),u=s(124);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())}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(90),a=s(121),n=s(10),r=s(36),o=s(109),d=s(21),c=s(7),l=s(4),h=s(8),u=s(161),p=s(85),g=s(27),f=s(0),m=s(131),v=s(147),_=s(20),y=s(29),I=s(12),P=s(80),M=s(74),S=s(141),b=s(170),w=s(120);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(S.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||e.pFlags.kicked)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=[],i=this.getFilter(e),a=i&&i[t];if(null==a?void 0:a.length){const e=a.filter((e,t)=>{const s=this.appPeersManager.getPeerId(e);return!this.reloadedPeerIds.has(s)&&!this.appMessagesManager.getDialogOnly(s)});if(e.length){const t=e.map(e=>{const t=this.appPeersManager.getPeerId(e),s=this.appMessagesManager.reloadConversation(e);return s.then(()=>{this.reloadedPeerIds.add(t)}),s}),i=Promise.all(t);s.push(i)}}return s.length?Promise.all(s):void 0}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 D=s(77),T=s(66),O=s(81),F=s(88),x=s(62),j=s(70),L=s(142),R=s(34),B=s(59),N=s(174),H=s(132),G=s(140),z=s(73),V=s(1),W=s(108),q=s(67),$=s(154),K=s(96),Y=s(187),J=s(125),Q=s(47),Z=s(110),X=s(86),ee=s(97),te=s(175),se=s(188),ie=s(135),ae=s(100),ne=s(43),re=s(146),oe=s(40),de=s(180),ce=s(124);var le=s(89),he=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 ue=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)},D.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 D.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=_.e,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 U(this,x.a,B.a,W.a,R.c,D.a,f.a),this.dialogsStorage=new C(this,T.a,x.a,B.a,H.a,W.a,R.c,D.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=>{D.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)});D.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,M;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"),M="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],M="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",M="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],M="sendMessageUploadDocumentAction";else d="document",c="document."+l.split("/")[1],M="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 S=p?void 0:new a.a({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),b=Object(n.a)();S&&(S.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:S,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=>he(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"===M||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));M&&this.setTyping(e,{_:M,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=>{D.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 he(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=>{D.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)}),D.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 D.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 he(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 n,r,o;const d=this.getMessageByPeer(t,s),c=this.generateOutgoingMessage(e,i),l=["entities","media"];i.dropAuthor||(c.fwd_from=this.generateForwardHeader(e,d),l.push("views","forwards"),(null===(n=c.fwd_from)||void 0===n?void 0:n.from_name)&&e===f.a.myId&&delete c.from_id),i.dropCaptions&&d.media||l.push("message"),l.forEach(e=>{c[e]=d[e]});const h=null===(r=c.media)||void 0===r?void 0:r.document;if(h){["round","voice"].includes(h.type)&&(c.pFlags.media_unread=!0)}if(d.grouped_id){(null!==(o=a[d.grouped_id])&&void 0!==o?o:a[d.grouped_id]={tempId:""+ ++this.groupedTempId,messages:[]}).messages.push(c)}return c});for(const e in a){const t=a[e];t.messages.length>1&&t.messages.forEach(e=>{e.grouped_id=t.tempId})}n.forEach(e=>{this.beforeMessageSending(e,{isScheduled:!!i.scheduleDate||void 0})});const r={};this.pendingAfterMsgs[e]&&(r.afterMessageId=this.pendingAfterMsgs[e].messageId);const o=h.a.invokeApiAfter("messages.forwardMessages",{from_peer:x.a.getInputPeerById(t),id:s.map(e=>ee.a.getServerMessageId(e)),random_id:n.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},r).then(e=>{this.log("forwardMessages updates:",e),D.a.processUpdateMessage(e)}).finally(()=>{this.pendingAfterMsgs[e]===r&&delete this.pendingAfterMsgs[e]});return this.pendingAfterMsgs[e]=r,o}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 s=[],i={};for(const[e,{inputDialogPeer:t,promise:a}]of this.reloadConversationsPeers)s.push(t),i[e]=a;this.reloadConversationsPeers.clear();const a=()=>{for(const e in i)i[e].resolve(void 0)};h.a.invokeApi("messages.getPeerDialogs",{peers:s}).then(t=>{this.dialogsStorage.applyDialogs(t),t.dialogs.forEach(e=>{const t=e.peerId;t&&(i[t].resolve(e),delete i[t])}),a(),e()},e=>{a(),t(e)}).finally(()=>{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=>(D.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 he(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&&D.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=>{D.a.processUpdateMessage(e)})}unpinAllMessages(e){return h.a.invokeApiSingle("messages.unpinAllMessages",{peer:x.a.getInputPeerById(e)}).then(t=>{if(D.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":d(void 0,i?"📊 "+(s.poll.question||"poll"):s.poll.rReply);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;e.stickerEmojiRaw&&d(void 0,(i?e.stickerEmojiRaw:e.stickerEmoji)+" "),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(M.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=>{D.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=>{D.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}:{};D.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})}filterMessagesByInputFilter(e,t,s,i){const a=[];if(!t.length)return a;let n=!0;const r={},o=[],d=[];switch(e){case"inputMessagesFilterPhotos":r.messageMediaPhoto=!0;break;case"inputMessagesFilterPhotoVideo":r.messageMediaPhoto=!0,r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterVideo":r.messageMediaDocument=!0,o.push("video");break;case"inputMessagesFilterDocument":r.messageMediaDocument=!0,d.push("video");break;case"inputMessagesFilterVoice":r.messageMediaDocument=!0,o.push("voice");break;case"inputMessagesFilterRoundVoice":r.messageMediaDocument=!0,o.push("round","voice");break;case"inputMessagesFilterRoundVideo":r.messageMediaDocument=!0,o.push("round");break;case"inputMessagesFilterMusic":r.messageMediaDocument=!0,o.push("audio");break;case"inputMessagesFilterUrl":r.url=!0;break;case"inputMessagesFilterChatPhotos":r.avatar=!0;break;default:n=!1}if(!n)return a;for(let e=0,n=t.length;ee.includes(t._))||g.a.matchUrl(n.message))&&(c=!0)}}else r.avatar&&n.action&&["messageActionChannelEditPhoto","messageActionChatEditPhoto","messageActionChannelEditVideo","messageActionChatEditVideo"].includes(n.action._)&&(c=!0);if(c&&(a.push(n),a.length>=i))break}return a}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.filterMessagesByInputFilter(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=>{D.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=>{D.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)})),D.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)})),D.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=>{D.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})})),D.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,D.a.processLocalUpdate(i)});return D.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_countee.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=>{D.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=>{D.a.processUpdateMessage(e)})}getMessageWithReplies(e){if(e.peerId===_.d||(e=this.filterMessages(e,e=>!!e.replies)[0])&&e.replies&&e.replies.pFlags.comments&&"777"!==e.replies.channel_id)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 he(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)&&D.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},D.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!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=ue;t.a=ue},,,function(e,t,s){"use strict";var i=s(1),a=s(3),n=s(40),r=s(19),o=s(120),d=s(8),c=s(27),l=s(0),h=s(77),u=s(62),p=s(34),g=s(59),f=s(43),m=s(38);const v=new class{constructor(){this.storage=p.c.storages.chats,this.onChatUpdated=(e,t)=>{var s;h.a.processUpdateMessage(t),(null===(s=null==t?void 0:t.updates)||void 0===s?void 0:s.length)&&this.isChannel(e)&&l.a.dispatchEvent("invalidate_participants",e)},this.clear(!0),l.a.addMultipleEventsListeners({updateChannelParticipant:e=>{d.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e.channel_id)},updateChatDefaultBannedRights:e=>{const t=u.a.getPeerId(e.peer).toChatId(),s=this.chats[t];s&&(s.default_banned_rights=e.default_banned_rights,l.a.dispatchEvent("chat_update",t))}}),p.c.getState().then(e=>{const t=p.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())})}),p.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=p.c.storagesResults.chats;for(const t in this.chats)t&&(p.c.isPeerNeeded(t.toPeerId(!0))||(Object(m.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;e.initials=c.a.getAbbreviation(e.title),"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),l.a.dispatchEvent("chat_update",e.id)}const d=e.id.toPeerId(!0);n&&l.a.dispatchEvent("avatar_update",d),r&&l.a.dispatchEvent("peer_title_edit",d),p.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.kicked||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:u.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.kicked||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=>{h.a.processUpdateMessage(e);const t=e.chats[0].id;return l.a.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}inviteToChannel(e,t){const s=this.getChannelInput(e),i=t.map(e=>g.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=>g.a.getUserInput(e)),title:e}).then(e=>{h.a.processUpdateMessage(e);const t=e.chats[0].id;return l.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:g.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:g.a.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,g.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=>{h.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=>{h.a.processUpdateMessage(e)})}editAbout(e,t){const s=e.toPeerId(!0);return d.a.invokeApi("messages.editChatAbout",{peer:u.a.getInputPeerById(s),about:t}).then(e=>(e&&l.a.dispatchEvent("peer_bio_edit",s),e))}getParticipantPeerId(e){return e.peer?u.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:u.a.getInputPeerById(i),banned_rights:s}).then(a=>{if(this.onChatUpdated(e,a),"object"==typeof t){const a=Date.now()/1e3|0;h.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:g.a.getSelf().id,peer:u.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=>{h.a.processUpdateMessage(e)})}toggleSignatures(e,t){return d.a.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(e=>{h.a.processUpdateMessage(e)})}toggleNoForwards(e,t){return d.a.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(e=>{h.a.processUpdateMessage(e)})}setChatAvailableReactions(e,t){return d.a.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(e=>{h.a.processUpdateMessage(e)})}isRestricted(e){const t=this.getChat(e),s=t.restriction_reason;return!!(t.pFlags.restricted&&s&&Object(f.c)(s))}getSendAs(e){return d.a.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(g.a.saveApiUsers(e.users),v.saveApiChats(e.chats),e.peers)})}};i.a.appChatsManager=v,t.a=v},function(e,t,s){"use strict";s.d(t,"a",(function(){return p}));var i=s(1),a=s(62),n=s(0),r=s(7),o=s(58),d=s(59),c=s(27),l=s(20),h=s(124);const u=new WeakMap;i.a.peerTitleWeakMap=u,n.a.addEventListener("peer_title_edit",e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach(e=>{const t=u.get(e);t&&t.update()})});class p{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),u.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(this.element.innerHTML=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")):this.element.innerHTML=a.a.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols)}}},,,function(e,t,s){"use strict";var i=s(140),a=s(2),n=s(8),r=s(161),o=s(88),d=s(59),c=s(150),l=s(1),h=s(98),u=s(136),p=s(61),g=s(99);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;t?s=e instanceof Uint8Array?e:new Uint8Array(e):(s=new Uint8Array(_.jpegHeader.concat(Array.from(e.slice(3)),_.jpegTail)),s[164]=e[1],s[166]=e[2]),i=t?a.g?"image/png":"image/webp":"image/jpeg";const n=new Blob([s],{type:i});return URL.createObjectURL(n)}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),a=new Image;a.classList.add("thumbnail");const n=(s?Object(c.a)(i):Promise.resolve(i)).then(e=>Object(h.b)(a,e));return{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&&777!==n.replies.channel_id)&&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)}}_.jpegHeader=f("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),_.jpegTail=f("ffd9");const y=new _;l.a&&(l.a.appPhotosManager=y);t.a=y},,,function(e,t,s){"use strict";s.r(t),s.d(t,"AppProfileManager",(function(){return _}));var i=s(1),a=s(36),n=s(153),r=s(7),o=s(8),d=s(0),c=s(131),l=s(77),h=s(66),u=s(97),p=s(108),g=s(62),f=s(70),m=s(59),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.kicked||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(59),d=s(66),c=s(62),l=s(34),h=s(85),u=s(86),p=s(39),g=s(27),f=s(5);const m=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 t=l.c.newVersion;e&&e.pts&&e.date?(Object.assign(this.updatesState,e),this.log("will get difference",Object.assign({},e)),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(),t&&this.updatesState.syncLoading.then(()=>{fetch("changelogs/"+t.split(" ")[0]+".md").then(e=>200===e.status&&e.ok&&e.text()||Promise.reject()).then(e=>{e=`**Telegram Web${f.a.suffix} was updated to version ${t}**\n\n`+e;const s=[],i={_:"updateServiceNotification",entities:s,message:g.b.parseMarkdown(e,s),type:"local",pFlags:{},inbox_date:Date.now()/1e3|0,media:void 0};this.processLocalUpdate(i)}).catch(p.a)})}))}};i.a.apiUpdatesManager=m,t.a=m},function(e,t,s){"use strict";var i=s(8),a=s(0),n=s(81),r=s(12),o=s(1),d=s(17),c=s(69),l=s(61),h=s(28),u=s(27),p=s(86),g=s(115),f=s(172),m=s(80),v=s(38),_=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(140),a=s(161),n=s(171),r=s(27),o=s(88),d=s(70),c=s(150),l=s(8),h=s(1),u=s(36),p=s(0),g=s(45),f=s(172),m=s(170),v=s(19),_=s(173),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=e.fileName=""),"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);return i.url||(s="bytes"in t?Object(c.a)(d.a.getPreviewURLFromBytes(t.bytes,!!e.sticker)).then(e=>{i.url=e}):d.a.preloadPhoto(e,t)),{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(29),a=s(39);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(74),d=s(38),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";function i(e){const t=document.createElement("span");return t.innerHTML=e,t}s.d(t,"a",(function(){return i}))},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(){this.width=0,this.height=0;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(38),n=s(86),r=s(127);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(77),u=s(81),p=s(97),g=s(62),f=s(73),m=s(59),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";var i=s(134),a=s(1),n=s(10),r=s(36),o=s(2),d=s(7),c=s(8),l=s(50),h=s(0),u=s(11),p=s(77),g=s(66),f=s(62),m=s(24),v=s(34),_=s(59),y=s(168),I=s(20),P=s(22),M=s(40),S=s(169);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(S.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(S.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(S.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(M.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(61),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(72),a=s(35),n=s(32),r=s(56),o=s(102),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";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(1),a=s(98),n=s(58),r=s(138),o=s(20),d=s(27),c=s(0),l=s(88),h=s(62),u=s(70),p=s(59);const g=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=h.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=l.a.download(o);a=r[s]=d.then(e=>r[s]=URL.createObjectURL(e))}return{cached:n,loadPromise:a}}putAvatar(e,t,s,i,o=new Image,d=!1){let l,h,p,{cached:g,loadPromise:f}=this.loadAvatar(t,s,i);if(o.classList.add("avatar-photo"),g)h=()=>{Object(n.a)(e,o),e.dataset.color=""};else{const d=c.a.settings.animationsEnabled;if(d&&o.classList.add("fade-in"),"photo_big"===i){const i=this.putAvatar(e,t,s,"photo_small");l=i.loadPromise,p=i.thumbImage}else if(s.stripped_thumb){p=new Image,e.classList.add("avatar-relative"),p.classList.add("avatar-photo","avatar-photo-thumbnail");const t=u.a.getPreviewURLFromBytes(s.stripped_thumb);l=Object(a.b)(p,t).then(()=>{Object(n.a)(e,p)})}h=()=>{p?e.append(o):Object(n.a)(e,o),setTimeout(()=>{e.childElementCount&&r.a.mutateElement(o,()=>{e.dataset.color="",d&&o.classList.remove("fade-in"),p&&p.remove()})},d?200:0)}}const m=f.then(e=>Object(a.b)(o,e)).then(h);return{cached:g,loadPromise:l||m,thumbImage:p}}s(e,t,s,i){e.innerHTML=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){var r;const l=c.a.myId;if(t===l&&s)return void this.s(e,"","","tgico-saved");if(t!==o.c&&t.isUser()){const s=p.a.getUser(t);if(s&&s.pFlags&&s.pFlags.deleted)return void this.s(e,"",h.a.getPeerColorById(t),"tgico-deletedaccount")}const u=h.a.getPeerPhoto(t),g=!!u,f=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!g||!f||!this.savedAvatarURLs[t]){let a,n="";if(!t||t===l&&s||(n=h.a.getPeerColorById(t)),t===o.d)return void this.s(e,"",n,"tgico-reply_filled");if(i)a=d.b.getAbbreviation(i);else{a=null!==(r=h.a.getPeer(t).initials)&&void 0!==r?r:""}this.s(e,a,n,"")}if(g){const s=n?"photo_big":"photo_small";return this.putAvatar(e,t,u,s,void 0,a)}}};i.a&&(i.a.appAvatarsManager=g),t.a=g},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";s.d(t,"a",(function(){return a}));var i=s(149);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=this.fullTexts;this.options&&(e=Object(i.c)(e,this.options));const s=[],a=e.split(" "),n=a.length;t.forEach((e,t)=>{let i=!0,r=0;for(let t=0;te.fullTextLength-t.fullTextLength||t.foundChars-e.foundChars);return new Set(s.map(e=>e.what))}}},function(e,t,s){"use strict";var i=s(0),a=s(62),n=s(63),r=s(77),o=s(27),d=s(85),c=s(8),l=s(36),h=s(1),u=s(11),p=s(97),g=s(86),f=s(19),m=s(40),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 _=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=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 v(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=_,t.a=_},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(74),a=s(18),n=s(158);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";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(61),r=s(103),o=s(35);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(176),n=s(120),r=s(21),o=s(42),d=s(182),c=s(126),l=s(157),h=s(144),u=s(190),p=s(155),g=s(156),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(133),v=s(4),_=s(8),y=s(20),I=s(0),P=s(77),M=s(66),S=s(62),b=s(59),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=S.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:S.a.getPeerId(t.peer),a=yield _.a.invokeApiSingle("phone.editGroupCallParticipant",{call:C.getGroupCallInput(e),participant:i===y.c?S.a.getInputPeerSelf():S.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),M.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:S.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:S.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;M.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(27),d=s(0),c=s(77),l=s(97),h=s(63),u=s(62),p=s(59);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.rQuestion=o.a.wrapEmojiText(e.question),e.rReply=o.a.wrapEmojiText("📊")+" "+(e.rQuestion||"poll"),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(111);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(157),r=s(143),o=s(158),d=s(145);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 r})),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;function r(e){return e.replace(a,"").replace(n,"")}function o(e){return e.replace(/[^A-Za-z0-9]/g,e=>{const t=i[e];return void 0!==t?t:e})}function d(e,t=!0){const s="%"===e.charAt(0);return e=r(e),t&&(e=o(e)),e=e.toLowerCase(),s&&(e="%"+e),e}function c(e,t={}){const s=t.includeTag&&"%"===e.charAt(0);return t.clearBadChars&&(e=r(e)),t.latinize&&(e=o(e)),t.ignoreCase&&(e=e.toLowerCase()),s&&(e="%"+e),e}},function(e,t,s){"use strict";s.d(t,"a",(function(){return f}));var i=s(10),a=s(91),n=s(35),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"){return e.items.length?(e.promise=Object(i.a)(),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()})}}(),e.promise):Promise.resolve([])}const l="filter"in(document.createElement("canvas").getContext("2d")||{});let h,u;function p(e,t,s){return new Promise(i=>{const a=document.createElement("canvas");a.width=e.width,a.height=e.height;const n=a.getContext("2d",{alpha:!1});l?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,a.width+4*t,a.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,a.width,a.height,t,s)),i(a.toDataURL())})}h=l?Promise.resolve():s.e(24).then(s.bind(null,197)).then(e=>{u=e.default});const g=new Map;function f(e,t=2,s=2){if(!e)return console.error("no dataUri for blur",e),Promise.resolve(e);if(g.size>1e3&&g.clear(),g.has(e))return g.get(e);const i=new Promise(i=>{h.then(()=>{const a=new Image;a.onload=()=>{l?p(a,t,s).then(i):c({items:[[a,t,s]],context:null,process:p},"unshift").then(e=>{i(e[0])})},a.src=e})});return g.set(e,i),i}},,,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){var 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(179),n=s(145);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,M,S,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),M.set(this,void 0),S.set(this,void 0),b(this,I,e,"f"),b(this,P,t,"f"),b(this,M,s,"f"),b(this,S,i,"f")}get type(){return w(this,I,"f")}get port(){return w(this,P,"f")}get protocol(){return w(this,M,"f")}get ids(){return w(this,S,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}I=new WeakMap,P=new WeakMap,M=new WeakMap,S=new WeakMap;var E,k,A,U,D=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),U.set(this,void 0),D(this,E,e,"f"),"string"==typeof t){if(D(this,k,t,"f"),"m"===e){const e=t.split(" ");D(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],D(this,U,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof C?(D(this,A,t,"f"),D(this,k,t.toString(),"f")):t instanceof y&&(D(this,U,t,"f"),D(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,U,"f")}get mediaLineParts(){return T(this,A,"f")}toString(){return`${this.key}=${this.value}`}}E=new WeakMap,k=new WeakMap,A=new WeakMap,U=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(63),a=s(78),n=s(1),r=s(8),o=s(86),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(145);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";function i(e){return[...new Set(e)]}s.d(t,"a",(function(){return i}))},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(70),a=s(81),n=s(27),r=s(0),o=s(1),d=s(120),c=s(124);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 o,h;if("webPageNotModified"===e._)return;const{id:u}=e,p=this.webpages[u],g=p&&p._===e._&&p.hash==p.hash;if("webPage"===e._){"photo"===(null===(o=e.photo)||void 0===o?void 0:o._)?e.photo=i.a.savePhoto(e.photo,s):delete e.photo,"document"===(null===(h=e.document)||void 0===h?void 0:h._)?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,r=Object(c.a)(r,80,100),e.rTitle=n.a.wrapRichText(r,{noLinks:!0,noLinebreaks:!0});let d="";if("GitHub"===t){const t=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);t&&(d=t[0]+"/issues/{1}")}const u=Object(c.a)(e.description||"",150,180);e.rDescription=n.a.wrapRichText(u,{contextSite:t||"external",contextHashtag:d}),l.has(e.type)||e.description||!e.photo||(e.type="photo")}let f=this.pendingWebPages[u];if(t&&(f||(f=this.pendingWebPages[u]=new Set),f.add(t)),void 0===p?this.webpages[u]=e:Object(d.a)(p,e),!t&&void 0!==f&&g){const e=[];f.forEach(t=>{const[s,i,a]=t.split("_");e.push({peerId:s.toPeerId(),mid:+i,isScheduled:!!a})}),r.a.dispatchEvent("webpage_updated",{id:u,msgs:e})}return e}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";var i=s(45);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(74),n=s(18),r=s(22),o=s(77),d=s(135),c=s(62),l=s(4),h=s(8),u=s(20),p=s(0),g=s(189),f=s(80),m=s(183);var v=s(3),_=s(133),y=s(159),I=s(158),P=s(162);var 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())}))};class S 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 M(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 M=I.updates.find(e=>"updateGroupCallConnection"===e._),S=JSON.parse(M.params.data);return S.audio=S.audio||i.connections.main.description.audio,a.setData(S),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,S),S}))}negotiateInternal(){return M(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(126),w=s(177),C=s(178),E=s(155),k=s(156),A=s(143),U=s(144),D=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 S(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 D(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Object(C.a)(Object(w.a)()),s=new U.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 D(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 D(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 D(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(133);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(39),n=s(190),r=s(177),o=s(178),d=s(155),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(156),u=s(143),p=s(144);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.7ffd20da266d386fcaec.chunk.js.map \ No newline at end of file diff --git a/public/6.7ffd20da266d386fcaec.chunk.js.map b/public/6.7ffd20da266d386fcaec.chunk.js.map deleted file mode 100644 index f0d2b21a..00000000 --- a/public/6.7ffd20da266d386fcaec.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/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/helpers/dom/htmlToSpan.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/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/helpers/string/limitSymbols.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/lib/calls/groupCallState.ts","webpack:///./src/helpers/callbackify.ts","webpack:///./src/lib/searchIndex.ts","webpack:///./src/lib/appManagers/appDraftsManager.ts","webpack:///./src/lib/calls/localConferenceDescription.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/config/latinizeMap.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/helpers/number/numberThousandSplitter.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/helpers/array/filterUnique.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/lib/appManagers/appWebPagesManager.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","initials","fullName","deleted","cleanSearchText","getAbbreviation","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","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","kicked","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","reloadPromises","reloadPromise","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","newMessages","generateForwardHeader","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","rReply","game","stickerEmojiRaw","stickerEmoji","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","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","foundMsgs","filtering","neededContents","neededDocTypes","excludeDocTypes","goodEntities","matchUrl","nextRate","backLimit","minDate","maxDate","offset_id_offset","next_rate","filterMessagesByInputFilter","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","createObjectURL","num","getPreviewURLFromBytes","useBlur","getPreviewURLFromThumb","Image","renderImageFromUrl","noZoom","choosePhotoSize","boxSize","aspect","isFit","aspectCovered","style","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","dcId","dc_id","photoId","fullWidth","windowSize","fullHeight","download","getDownload","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","newVersion","stateResult","setUpdatesProcessor","setProxy","fetch","ok","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","canvas","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","audioTitle","audioPerformer","alt","stickerSetInput","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","thumbSize","inputFileLocation","getFileDownloadOptions","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","html","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","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","toDataURL","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","limitFrom","savedAvatarURLs","getAvatarPromise","peerPhotoFileLocation","big","limitPart","img","onlyThumb","renderThumbPromise","thumbImage","animate","animationsEnabled","putAvatar","childElementCount","mutateElement","renderPromise","isDialog","isBig","getPeerColorById","avatarAvailable","avatarRendered","abbr","GROUP_CALL_STATE","SearchIndex","minChars","fullTexts","searchText","newFoundObjs","queryWords","queryWordsLength","fullText","what","foundChars","word","fullTextLength","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","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","rQuestion","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","badCharsRe","trimRe","clearBadCharsAndTrim","latinizeString","ch","latinizeCh","hasTag","processSearchText","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","performance","possiblePromise","process","realResult","timedChunk","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","alpha","default","blurPromises","dataUri","onload","numberThousandSplitter","joiner","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","photoTypeSet","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","rTitle","contextHashtag","matches","shortDescriptionText","description","rDescription","contextSite","pendingSet","IMAGE_MIME_TYPES_SUPPORTED","AudioAssetPlayer","assets","assetName","play","Audio","pause","getScreenConstraints","skipAudio","getScreenStream","screenStream","getDisplayMedia","getVideoTracks","contentHint","StringFromLineBuilder","newLine","strs","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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K,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,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,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,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,IAA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","file":"6.7ffd20da266d386fcaec.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.initials === undefined \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 user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\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] || {id, pFlags: {deleted: true}, access_hash: ''} 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 = false, onlyFirstName = false, _limitSymbols?: number) {\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 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(chat._ === 'channelForbidden' /* || chat._ === 'chatForbidden' */ || (chat as Chat.chat).pFlags.left || (chat as Chat.chat).pFlags.kicked) {\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 { 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 apiManager from \"../mtproto/mtprotoworker\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport copy from \"../../helpers/object/copy\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\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 public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const promises: Promise[] = [];\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(peers?.length) {\n const reloadDialogs = peers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\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_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\";\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: any) => 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: any) => 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 newMessages = mids.map(mid => {\n const originalMessage: Message.message = this.getMessageByPeer(fromPeerId, mid);\n const message: Message.message = this.generateOutgoingMessage(peerId, options);\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 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 reject(err);\n }).finally(() => {\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) => {\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 addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\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 addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\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) as any);\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 element.innerHTML = 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 filterMessagesByInputFilter(inputFilter: MyInputMessagesFilter, history: number[], storage: MessagesStorage, limit: number) {\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 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 = storage.get(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 && ((neededDocTypes.length && !neededDocTypes.includes(doc.type)) \n || excludeDocTypes.includes(doc.type))) {\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.filterMessagesByInputFilter(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 !== '777')) {\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 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 chat.initials = RichTextProcessor.getAbbreviation(chat.title);\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 Chat.chat).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 Chat.chat).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\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 this.element.innerHTML = 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 this.element.innerHTML = 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\";\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 const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\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 const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, 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 !== 777)\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","/*\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 noop from '../../helpers/noop';\nimport RichTextProcessor from '../richtextprocessor';\nimport App from '../../config/app';\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() {\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(() => {\n fetch('changelogs/' + newVersion.split(' ')[0] + '.md')\n .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject())\n .then(text => {\n const pre = `**Telegram Web${App.suffix} was updated to version ${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 this.processLocalUpdate(update);\n })\n .catch(noop);\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 doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\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 doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\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.fileName = 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 = doc.fileName = '';\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 promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\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\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = 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 { 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?: (err?: Event) => 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 = 0;\n public height = 0;\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 * 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","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","/*\n * 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 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 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 replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\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: string, color: string, icon: string) {\n div.innerHTML = 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 let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\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","/*\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';\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 public search(query: string) {\n const fullTexts = this.fullTexts;\n //const shortIndexes = searchIndex.shortIndexes;\n\n if(this.options) {\n query = processSearchText(query, this.options);\n }\n\n const newFoundObjs: Array<{fullText: string, fullTextLength: number, what: SearchWhat, foundChars: number}> = [];\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] !== ' ')) { // * 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 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 /* const queryWords = query.split(' ');\n let foundArr: number[];\n for(let i = 0; i < queryWords.length; i++) {\n const newFound = shortIndexes[queryWords[i].substr(0, 3)];\n if(!newFound) {\n foundArr = [];\n break;\n }\n \n if(foundArr === undefined || foundArr.length > newFound.length) {\n foundArr = newFound;\n }\n }\n\n for(let j = 0; j < foundArr.length; j++) {\n let found = true;\n let searchText = fullTexts[foundArr[j]];\n for(let i = 0; i < queryWords.length; i++) {\n if(searchText.indexOf(queryWords[i]) === -1) {\n found = false;\n break;\n }\n }\n\n if(found) {\n newFoundObjs[foundArr[j]] = true;\n }\n } */\n\n return newFoundObjs2;\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 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\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 = 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","\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.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\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","/*\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\nconst badCharsRe = /[`~!@#$%^&*()\\-_=+\\[\\]\\\\|{}'\";:\\/?.>,<]+/g;\nconst trimRe = /^\\s+|\\s$/g;\n\nexport function clearBadCharsAndTrim(text: string) {\n return text.replace(badCharsRe, '').replace(trimRe, '');\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 !== undefined ? latinizeCh : ch;\n });\n}\n\nexport default function cleanSearchText(text: string, latinize = true) {\n const hasTag = text.charAt(0) === '%';\n text = clearBadCharsAndTrim(text);\n if(latinize) text = latinizeString(text);\n \n text = text.toLowerCase();\n if(hasTag) text = '%' + text;\n\n return text;\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 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 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 deferredPromise, { CancellablePromise } from \"./cancellablePromise\";\r\nimport { getHeavyAnimationPromise } from \"../hooks/useHeavyAnimationCheck\";\r\nimport { fastRaf } from \"./schedulers\";\r\n\r\ntype HeavyQueue = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask(queue: HeavyQueue, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.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([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\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: T;\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\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\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(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\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(isFilterAvailable) {\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 resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const 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(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\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","/*\r\n * https://github.com/morethanwords/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) {\r\n var 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","export default function filterUnique>(arr: T): T {\n return [...new Set(arr)] as T;\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","/*\r\n * https://github.com/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 shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\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\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\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 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","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/6.fcc4f6420b303e25e8ce.chunk.js b/public/6.fcc4f6420b303e25e8ce.chunk.js new file mode 100644 index 00000000..3ff278d6 --- /dev/null +++ b/public/6.fcc4f6420b303e25e8ce.chunk.js @@ -0,0 +1,2 @@ +(this.webpackJsonp=this.webpackJsonp||[]).push([[6],Array(59).concat([function(e,t,s){"use strict";var i=s(1),a=s(154),n=s(38),r=s(74),o=s(10),d=s(149);function c(e){return e&&e.toLowerCase()||""}var l=s(36),h=s(118),u=s(19),p=s(120),g=s(43),f=s(7),m=s(8),v=s(20),_=s(85),y=s(27),I=s(0),P=s(133),M=s(77),S=s(66),b=s(62),w=s(34);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),S.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&&M.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.initials&&void 0!==n.sortName&&n.first_name===e.first_name&&n.last_name===e.last_name)e.sortName=n.sortName,e.initials=n.initials;else{const t=e.first_name+(e.last_name?" "+e.last_name:"");e.sortName=e.pFlags.deleted?"":Object(d.b)(t,!1),e.initials=y.a.getAbbreviation(t)}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]||{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.d:s="Peer.RepliesNotifications";break;case v.e: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.d}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(M.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),S.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),S.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=>(M.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),S.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=>{M.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=>{M.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(27),n=s(0),r=s(66),o=s(59),d=s(7),c=s(20),l=s(43),h=s(19),u=s(124);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())}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(90),a=s(121),n=s(10),r=s(36),o=s(109),d=s(21),c=s(7),l=s(4),h=s(8),u=s(162),p=s(85),g=s(27),f=s(0),m=s(133),v=s(147),_=s(20),y=s(29),I=s(12),P=s(80),M=s(74),S=s(141),b=s(170),w=s(120);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(S.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=[],i=this.getFilter(e),a=i&&i[t];if(null==a?void 0:a.length){const e=a.filter((e,t)=>{const s=this.appPeersManager.getPeerId(e);return!this.reloadedPeerIds.has(s)&&!this.appMessagesManager.getDialogOnly(s)});if(e.length){const t=e.map(e=>{const t=this.appPeersManager.getPeerId(e),s=this.appMessagesManager.reloadConversation(e);return s.then(()=>{this.reloadedPeerIds.add(t)}),s}),i=Promise.all(t);s.push(i)}}return s.length?Promise.all(s):void 0}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 D=s(77),T=s(66),O=s(82),F=s(88),x=s(62),j=s(70),L=s(142),R=s(34),B=s(59),N=s(174),H=s(131),G=s(140),z=s(73),V=s(1),W=s(108),q=s(67),$=s(155),K=s(96),Y=s(187),J=s(125),Q=s(47),Z=s(110),X=s(86),ee=s(97),te=s(175),se=s(188),ie=s(135),ae=s(100),ne=s(43),re=s(146),oe=s(40),de=s(180),ce=s(124);var le=s(89),he=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 ue=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)},D.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 D.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=_.e,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 U(this,x.a,B.a,W.a,R.c,D.a,f.a),this.dialogsStorage=new C(this,T.a,x.a,B.a,H.a,W.a,R.c,D.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=>{D.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)});D.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,M;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"),M="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],M="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",M="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],M="sendMessageUploadDocumentAction";else d="document",c="document."+l.split("/")[1],M="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 S=p?void 0:new a.a({attachMethod:"prepend",tryAgainOnFail:!1,isUpload:!0}),b=Object(n.a)();S&&(S.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:S,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=>he(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"===M||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));M&&this.setTyping(e,{_:M,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=>{D.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 he(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=>{D.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)}),D.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 D.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 he(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),D.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 s=[],i={};for(const[e,{inputDialogPeer:t,promise:a}]of this.reloadConversationsPeers)s.push(t),i[e]=a;this.reloadConversationsPeers.clear();const a=()=>{for(const e in i)i[e].resolve(void 0)};h.a.invokeApi("messages.getPeerDialogs",{peers:s}).then(t=>{this.dialogsStorage.applyDialogs(t),t.dialogs.forEach(e=>{const t=e.peerId;t&&(i[t].resolve(e),delete i[t])}),a(),e()},e=>{a(),t(e)}).finally(()=>{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=>(D.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 he(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&&D.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=>{D.a.processUpdateMessage(e)})}unpinAllMessages(e){return h.a.invokeApiSingle("messages.unpinAllMessages",{peer:x.a.getInputPeerById(e)}).then(t=>{if(D.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":d(void 0,i?"📊 "+(s.poll.question||"poll"):s.poll.rReply);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;e.stickerEmojiRaw&&d(void 0,(i?e.stickerEmojiRaw:e.stickerEmoji)+" "),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(M.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=>{D.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=>{D.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}:{};D.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=>{D.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=>{D.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)})),D.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)})),D.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=>{D.a.processUpdateMessage({_:"updateShort",update:{_:"updatePts",pts:e.pts,pts_count:e.pts_count}})})),D.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,D.a.processLocalUpdate(i)});return D.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=>{D.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=>{D.a.processUpdateMessage(e)})}getMessageWithReplies(e){if(e.peerId===_.d||(e=this.filterMessages(e,e=>!!e.replies)[0])&&e.replies&&e.replies.pFlags.comments&&"777"!==e.replies.channel_id)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 he(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)&&D.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},D.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=ue;t.a=ue},,,function(e,t,s){"use strict";var i=s(1),a=s(3),n=s(40),r=s(19),o=s(120),d=s(8),c=s(27),l=s(0),h=s(77),u=s(62),p=s(34),g=s(59),f=s(43),m=s(38);const v=new class{constructor(){this.storage=p.c.storages.chats,this.onChatUpdated=(e,t)=>{var s;h.a.processUpdateMessage(t),(null===(s=null==t?void 0:t.updates)||void 0===s?void 0:s.length)&&this.isChannel(e)&&l.a.dispatchEvent("invalidate_participants",e)},this.clear(!0),l.a.addMultipleEventsListeners({updateChannelParticipant:e=>{d.a.clearCache("channels.getParticipants",t=>t.channel.channel_id===e.channel_id)},updateChatDefaultBannedRights:e=>{const t=u.a.getPeerId(e.peer).toChatId(),s=this.chats[t];s&&(s.default_banned_rights=e.default_banned_rights,l.a.dispatchEvent("chat_update",t))}}),p.c.getState().then(e=>{const t=p.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())})}),p.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=p.c.storagesResults.chats;for(const t in this.chats)t&&(p.c.isPeerNeeded(t.toPeerId(!0))||(Object(m.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;e.initials=c.a.getAbbreviation(e.title),"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),l.a.dispatchEvent("chat_update",e.id)}const d=e.id.toPeerId(!0);n&&l.a.dispatchEvent("avatar_update",d),r&&l.a.dispatchEvent("peer_title_edit",d),p.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:u.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=>{h.a.processUpdateMessage(e);const t=e.chats[0].id;return l.a.dispatchEvent("history_focus",{peerId:t.toPeerId(!0)}),t})}inviteToChannel(e,t){const s=this.getChannelInput(e),i=t.map(e=>g.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=>g.a.getUserInput(e)),title:e}).then(e=>{h.a.processUpdateMessage(e);const t=e.chats[0].id;return l.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:g.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:g.a.getUserInput(t)}).then(this.onChatUpdated.bind(this,e))}leaveChat(e){return this.deleteChatUser(e,g.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=>{h.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=>{h.a.processUpdateMessage(e)})}editAbout(e,t){const s=e.toPeerId(!0);return d.a.invokeApi("messages.editChatAbout",{peer:u.a.getInputPeerById(s),about:t}).then(e=>(e&&l.a.dispatchEvent("peer_bio_edit",s),e))}getParticipantPeerId(e){return e.peer?u.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:u.a.getInputPeerById(i),banned_rights:s}).then(a=>{if(this.onChatUpdated(e,a),"object"==typeof t){const a=Date.now()/1e3|0;h.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:g.a.getSelf().id,peer:u.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=>{h.a.processUpdateMessage(e)})}toggleSignatures(e,t){return d.a.invokeApi("channels.toggleSignatures",{channel:this.getChannelInput(e),enabled:t}).then(e=>{h.a.processUpdateMessage(e)})}toggleNoForwards(e,t){return d.a.invokeApi("messages.toggleNoForwards",{peer:this.getInputPeer(e),enabled:t}).then(e=>{h.a.processUpdateMessage(e)})}setChatAvailableReactions(e,t){return d.a.invokeApi("messages.setChatAvailableReactions",{peer:this.getInputPeer(e),available_reactions:t}).then(e=>{h.a.processUpdateMessage(e)})}isRestricted(e){const t=this.getChat(e),s=t.restriction_reason;return!!(t.pFlags.restricted&&s&&Object(f.c)(s))}getSendAs(e){return d.a.invokeApiSingleProcess({method:"channels.getSendAs",params:{peer:this.getChannelInputPeer(e)},processResult:e=>(g.a.saveApiUsers(e.users),v.saveApiChats(e.chats),e.peers)})}};i.a.appChatsManager=v,t.a=v},function(e,t,s){"use strict";s.d(t,"a",(function(){return p}));var i=s(1),a=s(62),n=s(0),r=s(7),o=s(58),d=s(59),c=s(27),l=s(20),h=s(124);const u=new WeakMap;i.a.peerTitleWeakMap=u,n.a.addEventListener("peer_title_edit",e=>{Array.from(document.querySelectorAll(`.peer-title[data-peer-id="${e}"]`)).forEach(e=>{const t=u.get(e);t&&t.update()})});class p{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),u.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(this.element.innerHTML=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")):this.element.innerHTML=a.a.getPeerTitle(this.peerId,this.plainText,this.onlyFirstName,this.limitSymbols)}}},,,function(e,t,s){"use strict";var i=s(140),a=s(2),n=s(8),r=s(162),o=s(88),d=s(59),c=s(150),l=s(1),h=s(98),u=s(136),p=s(61),g=s(99);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;t?s=e instanceof Uint8Array?e:new Uint8Array(e):(s=new Uint8Array(_.jpegHeader.concat(Array.from(e.slice(3)),_.jpegTail)),s[164]=e[1],s[166]=e[2]),i=t?a.g?"image/png":"image/webp":"image/jpeg";const n=new Blob([s],{type:i});return URL.createObjectURL(n)}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),a=new Image;a.classList.add("thumbnail");const n=(s?Object(c.a)(i):Promise.resolve(i)).then(e=>Object(h.b)(a,e));return{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&&777!==n.replies.channel_id)&&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)}}_.jpegHeader=f("ffd8ffe000104a46494600010100000100010000ffdb004300281c1e231e19282321232d2b28303c64413c37373c7b585d4964918099968f808c8aa0b4e6c3a0aadaad8a8cc8ffcbdaeef5ffffff9bc1fffffffaffe6fdfff8ffdb0043012b2d2d3c353c76414176f8a58ca5f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8f8ffc00011080000000003012200021101031101ffc4001f0000010501010101010100000000000000000102030405060708090a0bffc400b5100002010303020403050504040000017d01020300041105122131410613516107227114328191a1082342b1c11552d1f02433627282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f0100030101010101010101010000000000000102030405060708090a0bffc400b51100020102040403040705040400010277000102031104052131061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a262728292a35363738393a434445464748494a535455565758595a636465666768696a737475767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9faffda000c03010002110311003f00"),_.jpegTail=f("ffd9");const y=new _;l.a&&(l.a.appPhotosManager=y);t.a=y},,,function(e,t,s){"use strict";s.r(t),s.d(t,"AppProfileManager",(function(){return _}));var i=s(1),a=s(36),n=s(153),r=s(7),o=s(8),d=s(0),c=s(133),l=s(77),h=s(66),u=s(97),p=s(108),g=s(62),f=s(70),m=s(59),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.kicked||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(59),d=s(66),c=s(62),l=s(34),h=s(85),u=s(86),p=s(27),g=s(5),f=s(154),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(82),r=s(12),o=s(1),d=s(17),c=s(69),l=s(61),h=s(28),u=s(27),p=s(86),g=s(115),f=s(172),m=s(80),v=s(38),_=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(140),a=s(162),n=s(171),r=s(27),o=s(88),d=s(70),c=s(150),l=s(8),h=s(1),u=s(36),p=s(0),g=s(45),f=s(172),m=s(170),v=s(19),_=s(173),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=e.fileName=""),"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);return i.url||(s="bytes"in t?Object(c.a)(d.a.getPreviewURLFromBytes(t.bytes,!!e.sticker)).then(e=>{i.url=e}):d.a.preloadPhoto(e,t)),{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(29),a=s(39);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(74),d=s(38),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";function i(e){const t=document.createElement("span");return t.innerHTML=e,t}s.d(t,"a",(function(){return i}))},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(){this.width=0,this.height=0;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(38),n=s(86),r=s(127);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(77),u=s(82),p=s(97),g=s(62),f=s(73),m=s(59),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";var i=s(134),a=s(1),n=s(10),r=s(36),o=s(2),d=s(7),c=s(8),l=s(50),h=s(0),u=s(11),p=s(77),g=s(66),f=s(62),m=s(24),v=s(34),_=s(59),y=s(168),I=s(20),P=s(22),M=s(40),S=s(169);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(S.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(S.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(S.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(M.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(61),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(72),a=s(35),n=s(32),r=s(56),o=s(102),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";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(1),a=s(98),n=s(58),r=s(138),o=s(20),d=s(27),c=s(0),l=s(88),h=s(62),u=s(70),p=s(59);const g=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=h.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=l.a.download(o);a=r[s]=d.then(e=>r[s]=URL.createObjectURL(e))}return{cached:n,loadPromise:a}}putAvatar(e,t,s,i,o=new Image,d=!1){let l,h,p,{cached:g,loadPromise:f}=this.loadAvatar(t,s,i);if(o.classList.add("avatar-photo"),g)h=()=>{Object(n.a)(e,o),e.dataset.color=""};else{const d=c.a.settings.animationsEnabled;if(d&&o.classList.add("fade-in"),"photo_big"===i){const i=this.putAvatar(e,t,s,"photo_small");l=i.loadPromise,p=i.thumbImage}else if(s.stripped_thumb){p=new Image,e.classList.add("avatar-relative"),p.classList.add("avatar-photo","avatar-photo-thumbnail");const t=u.a.getPreviewURLFromBytes(s.stripped_thumb);l=Object(a.b)(p,t).then(()=>{Object(n.a)(e,p)})}h=()=>{p?e.append(o):Object(n.a)(e,o),setTimeout(()=>{e.childElementCount&&r.a.mutateElement(o,()=>{e.dataset.color="",d&&o.classList.remove("fade-in"),p&&p.remove()})},d?200:0)}}const m=f.then(e=>Object(a.b)(o,e)).then(h);return{cached:g,loadPromise:l||m,thumbImage:p}}s(e,t,s,i){e.innerHTML=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){var r;const l=c.a.myId;if(t===l&&s)return void this.s(e,"","","tgico-saved");if(t!==o.c&&t.isUser()){const s=p.a.getUser(t);if(s&&s.pFlags&&s.pFlags.deleted)return void this.s(e,"",h.a.getPeerColorById(t),"tgico-deletedaccount")}const u=h.a.getPeerPhoto(t),g=!!u,f=!!e.firstElementChild&&!e.firstElementChild.classList.contains("emoji");if(!g||!f||!this.savedAvatarURLs[t]){let a,n="";if(!t||t===l&&s||(n=h.a.getPeerColorById(t)),t===o.d)return void this.s(e,"",n,"tgico-reply_filled");if(i)a=d.b.getAbbreviation(i);else{a=null!==(r=h.a.getPeer(t).initials)&&void 0!==r?r:""}this.s(e,a,n,"")}if(g){const s=n?"photo_big":"photo_small";return this.putAvatar(e,t,u,s,void 0,a)}}};i.a&&(i.a.appAvatarsManager=g),t.a=g},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";var i=s(0),a=s(62),n=s(63),r=s(77),o=s(27),d=s(85),c=s(8),l=s(36),h=s(1),u=s(11),p=s(97),g=s(86),f=s(19),m=s(40),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 _=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=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 v(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=_,t.a=_},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(74),a=s(18),n=s(159);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(149);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(61),r=s(103),o=s(35);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(176),n=s(120),r=s(21),o=s(42),d=s(182),c=s(126),l=s(158),h=s(144),u=s(190),p=s(156),g=s(157),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(132),v=s(4),_=s(8),y=s(20),I=s(0),P=s(77),M=s(66),S=s(62),b=s(59),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=S.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:S.a.getPeerId(t.peer),a=yield _.a.invokeApiSingle("phone.editGroupCallParticipant",{call:C.getGroupCallInput(e),participant:i===y.c?S.a.getInputPeerSelf():S.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),M.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:S.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:S.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;M.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(27),d=s(0),c=s(77),l=s(97),h=s(63),u=s(62),p=s(59);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.rQuestion=o.a.wrapEmojiText(e.question),e.rReply=o.a.wrapEmojiText("📊")+" "+(e.rQuestion||"poll"),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(111);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(158),r=s(143),o=s(159),d=s(145);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 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";s.d(t,"a",(function(){return f}));var i=s(10),a=s(91),n=s(35),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"){return e.items.length?(e.promise=Object(i.a)(),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()})}}(),e.promise):Promise.resolve([])}const l="filter"in(document.createElement("canvas").getContext("2d")||{});let h,u;function p(e,t,s){return new Promise(i=>{const a=document.createElement("canvas");a.width=e.width,a.height=e.height;const n=a.getContext("2d",{alpha:!1});l?(n.filter=`blur(${t}px)`,n.drawImage(e,2*-t,2*-t,a.width+4*t,a.height+4*t)):(n.drawImage(e,0,0),u(n,0,0,a.width,a.height,t,s)),i(a.toDataURL())})}h=l?Promise.resolve():s.e(24).then(s.bind(null,197)).then(e=>{u=e.default});const g=new Map;function f(e,t=2,s=2){if(!e)return console.error("no dataUri for blur",e),Promise.resolve(e);if(g.size>1e3&&g.clear(),g.has(e))return g.get(e);const i=new Promise(i=>{h.then(()=>{const a=new Image;a.onload=()=>{l?p(a,t,s).then(i):c({items:[[a,t,s]],context:null,process:p},"unshift").then(e=>{i(e[0])})},a.src=e})});return g.set(e,i),i}},,,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";function i(e){var 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(179),n=s(145);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,M,S,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),M.set(this,void 0),S.set(this,void 0),b(this,I,e,"f"),b(this,P,t,"f"),b(this,M,s,"f"),b(this,S,i,"f")}get type(){return w(this,I,"f")}get port(){return w(this,P,"f")}get protocol(){return w(this,M,"f")}get ids(){return w(this,S,"f")}toString(){return this.type+" "+this.port+" "+this.protocol+" "+this.ids.join(" ")}}I=new WeakMap,P=new WeakMap,M=new WeakMap,S=new WeakMap;var E,k,A,U,D=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),U.set(this,void 0),D(this,E,e,"f"),"string"==typeof t){if(D(this,k,t,"f"),"m"===e){const e=t.split(" ");D(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],D(this,U,1===e.length?new y(t,null):new y(t,e[1]),"f")}}else t instanceof C?(D(this,A,t,"f"),D(this,k,t.toString(),"f")):t instanceof y&&(D(this,U,t,"f"),D(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,U,"f")}get mediaLineParts(){return T(this,A,"f")}toString(){return`${this.key}=${this.value}`}}E=new WeakMap,k=new WeakMap,A=new WeakMap,U=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(63),a=s(78),n=s(1),r=s(8),o=s(86),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(145);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(70),a=s(82),n=s(27),r=s(0),o=s(1),d=s(120),c=s(124);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 o,h;if("webPageNotModified"===e._)return;const{id:u}=e,p=this.webpages[u],g=p&&p._===e._&&p.hash==p.hash;if("webPage"===e._){"photo"===(null===(o=e.photo)||void 0===o?void 0:o._)?e.photo=i.a.savePhoto(e.photo,s):delete e.photo,"document"===(null===(h=e.document)||void 0===h?void 0:h._)?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,r=Object(c.a)(r,80,100),e.rTitle=n.a.wrapRichText(r,{noLinks:!0,noLinebreaks:!0});let d="";if("GitHub"===t){const t=e.url.match(/(https?:\/\/github\.com\/[^\/]+\/[^\/]+)/);t&&(d=t[0]+"/issues/{1}")}const u=Object(c.a)(e.description||"",150,180);e.rDescription=n.a.wrapRichText(u,{contextSite:t||"external",contextHashtag:d}),l.has(e.type)||e.description||!e.photo||(e.type="photo")}let f=this.pendingWebPages[u];if(t&&(f||(f=this.pendingWebPages[u]=new Set),f.add(t)),void 0===p?this.webpages[u]=e:Object(d.a)(p,e),!t&&void 0!==f&&g){const e=[];f.forEach(t=>{const[s,i,a]=t.split("_");e.push({peerId:s.toPeerId(),mid:+i,isScheduled:!!a})}),r.a.dispatchEvent("webpage_updated",{id:u,msgs:e})}return e}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";var i=s(45);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(74),n=s(18),r=s(22),o=s(77),d=s(135),c=s(62),l=s(4),h=s(8),u=s(20),p=s(0),g=s(189),f=s(80),m=s(183);var v=s(3),_=s(132),y=s(160),I=s(159),P=s(163);var 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())}))};class S 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 M(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 M=I.updates.find(e=>"updateGroupCallConnection"===e._),S=JSON.parse(M.params.data);return S.audio=S.audio||i.connections.main.description.audio,a.setData(S),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,S),S}))}negotiateInternal(){return M(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(126),w=s(177),C=s(178),E=s(156),k=s(157),A=s(143),U=s(144),D=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 S(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 D(this,void 0,void 0,(function*(){try{const e="presentation",t=yield Object(C.a)(Object(w.a)()),s=new U.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 D(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 D(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 D(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(132);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(39),n=s(190),r=s(177),o=s(178),d=s(156),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(157),u=s(143),p=s(144);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.fcc4f6420b303e25e8ce.chunk.js.map \ No newline at end of file diff --git a/public/6.fcc4f6420b303e25e8ce.chunk.js.map b/public/6.fcc4f6420b303e25e8ce.chunk.js.map new file mode 100644 index 00000000..045a6358 --- /dev/null +++ b/public/6.fcc4f6420b303e25e8ce.chunk.js.map @@ -0,0 +1 @@ +{"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/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/helpers/dom/htmlToSpan.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/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/helpers/string/limitSymbols.ts","webpack:///./src/lib/appManagers/appAvatarsManager.ts","webpack:///./src/lib/calls/groupCallState.ts","webpack:///./src/helpers/callbackify.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/config/latinizeMap.ts","webpack:///./src/helpers/cleanSearchText.ts","webpack:///./src/helpers/heavyQueue.ts","webpack:///./src/helpers/blur.ts","webpack:///./src/helpers/number/numberThousandSplitter.ts","webpack:///./src/helpers/array/filterUnique.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/lib/appManagers/appWebPagesManager.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","initials","fullName","deleted","cleanSearchText","getAbbreviation","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","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","reloadPromises","reloadPromise","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","rReply","game","stickerEmojiRaw","stickerEmoji","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","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","createObjectURL","num","getPreviewURLFromBytes","useBlur","getPreviewURLFromThumb","Image","renderImageFromUrl","noZoom","choosePhotoSize","boxSize","aspect","isFit","aspectCovered","style","ignoreCache","getImageFromStrippedThumb","queueId","onlyCache","thumb_size","dcId","dc_id","photoId","fullWidth","windowSize","fullHeight","download","getDownload","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","kicked","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","canvas","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","audioTitle","audioPerformer","alt","stickerSetInput","ext","pop","mappedMimeType","monthAsNumber","leadingZero","isServiceWorkerOnline","getFileURL","thumbSize","inputFileLocation","getFileDownloadOptions","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","html","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","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","toDataURL","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","limitFrom","savedAvatarURLs","getAvatarPromise","peerPhotoFileLocation","big","limitPart","img","onlyThumb","renderThumbPromise","thumbImage","animate","animationsEnabled","putAvatar","childElementCount","mutateElement","renderPromise","isDialog","isBig","getPeerColorById","avatarAvailable","avatarRendered","abbr","GROUP_CALL_STATE","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","rQuestion","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","badCharsRe","trimRe","C2L","й","ц","у","к","е","н","г","ш","щ","з","х","ъ","ф","ы","в","а","п","р","о","л","д","ж","э","я","ч","с","м","и","т","ь","б","ю","clearBadCharsAndTrim","processSearchText","hasTag","originalText","ch","latinizeCh","latinizeString","fixCyrillic","heavyQueue","processingQueue","addHeavyTask","processHeavyQueue","todo","performance","possiblePromise","process","realResult","timedChunk","isFilterAvailable","requireBlurPromise","fastBlurFunc","processBlurNext","radius","iterations","alpha","default","blurPromises","dataUri","onload","numberThousandSplitter","joiner","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","photoTypeSet","webpages","pendingWebPages","updateWebPage","apiWebPage","oldWebPage","isUpdated","siteName","site_name","shortTitle","author","rTitle","contextHashtag","matches","shortDescriptionText","description","rDescription","contextSite","pendingSet","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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IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,IAAI,IAAK,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,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,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","file":"6.fcc4f6420b303e25e8ce.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.initials === undefined \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 user.initials = RichTextProcessor.getAbbreviation(fullName);\n } else {\n user.sortName = oldUser.sortName;\n user.initials = oldUser.initials;\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] || {id, pFlags: {deleted: true}, access_hash: ''} 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 = false, onlyFirstName = false, _limitSymbols?: number) {\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 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 Chat.chat).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 { 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 apiManager from \"../mtproto/mtprotoworker\";\nimport { AppStateManager } from \"../appManagers/appStateManager\";\nimport forEachReverse from \"../../helpers/array/forEachReverse\";\nimport copy from \"../../helpers/object/copy\";\nimport safeReplaceObject from \"../../helpers/object/safeReplaceObject\";\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 public reloadMissingPeerIds(filterId: number, type: 'pinned_peers' | 'include_peers' | 'exclude_peers' = 'pinned_peers') {\n const promises: Promise[] = [];\n const filter = this.getFilter(filterId);\n const peers = filter && filter[type];\n if(peers?.length) {\n const reloadDialogs = peers.filter((inputPeer, idx) => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n return !this.reloadedPeerIds.has(peerId) && !this.appMessagesManager.getDialogOnly(peerId);\n });\n\n if(reloadDialogs.length) {\n const reloadPromises = reloadDialogs.map(inputPeer => {\n const peerId = this.appPeersManager.getPeerId(inputPeer);\n const promise = this.appMessagesManager.reloadConversation(inputPeer);\n promise.then(() => {\n this.reloadedPeerIds.add(peerId);\n });\n return promise;\n });\n const reloadPromise = Promise.all(reloadPromises);\n promises.push(reloadPromise);\n }\n }\n\n return promises.length ? Promise.all(promises) : undefined;\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_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\";\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 reject(err);\n }).finally(() => {\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) => {\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 addPart(undefined, plain ? '📊' + ' ' + (media.poll.question || 'poll') : media.poll.rReply);\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 addPart(undefined, (plain ? document.stickerEmojiRaw : document.stickerEmoji) + ' ');\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) as any);\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 element.innerHTML = 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 !== '777')) {\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 chat.initials = RichTextProcessor.getAbbreviation(chat.title);\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 Chat.chat).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 Chat.chat).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\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 this.element.innerHTML = 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 this.element.innerHTML = 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\";\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 const blob = new Blob([arr], {type: mimeType});\n return URL.createObjectURL(blob);\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 const image = new Image();\n image.classList.add('thumbnail');\n\n const loadPromise = (useBlur ? blur(url) : Promise.resolve(url)).then(url => {\n return renderImageFromUrlPromise(image, url);\n });\n \n return {image, 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 !== 777)\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","/*\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 doc.fileName = RichTextProcessor.wrapEmojiText(attribute.file_name);\n break;\n\n case 'documentAttributeAudio':\n doc.duration = attribute.duration;\n doc.audioTitle = RichTextProcessor.wrapEmojiText(attribute.title);\n doc.audioPerformer = RichTextProcessor.wrapEmojiText(attribute.performer);\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 doc.stickerEmoji = RichTextProcessor.wrapRichText(doc.stickerEmojiRaw, {noLinks: true, noLinebreaks: true});\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.fileName = 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 = doc.fileName = '';\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 promise = blur(appPhotosManager.getPreviewURLFromBytes(thumb.bytes, !!doc.sticker)).then(url => {\n cacheContext.url = url;\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\nexport default function htmlToSpan(html: string) {\r\n const span = document.createElement('span');\r\n span.innerHTML = 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 { 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?: (err?: Event) => 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 = 0;\n public height = 0;\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 * 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","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","/*\n * 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 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 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 replaceContent(div, thumbImage);\n });\n }\n\n callback = () => {\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: string, color: string, icon: string) {\n div.innerHTML = 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 let abbr: string;\n if(!title) {\n const peer = appPeersManager.getPeer(peerId);\n abbr = peer.initials ?? '';\n } else {\n abbr = RichTextProcessor.getAbbreviation(title);\n }\n\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","/*\r\n * https://github.com/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\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 = 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.rQuestion = RichTextProcessor.wrapEmojiText(poll.question);\r\n poll.rReply = RichTextProcessor.wrapEmojiText('📊') + ' ' + (poll.rQuestion || 'poll');\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","/*\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","/*\r\n * https://github.com/morethanwords/tweb\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\n\r\ntype HeavyQueue = {\r\n items: any[], \r\n process: (...args: any[]) => T,\r\n context: any,\r\n promise?: CancellablePromise['process']>[]>\r\n};\r\nconst heavyQueue: HeavyQueue[] = [];\r\nlet processingQueue = false;\r\n\r\nexport default function addHeavyTask(queue: HeavyQueue, method: 'push' | 'unshift' = 'push') {\r\n if(!queue.items.length) {\r\n return Promise.resolve([]);\r\n }\r\n \r\n queue.promise = deferredPromise();\r\n heavyQueue[method](queue);\r\n processHeavyQueue();\r\n\r\n return queue.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([]);\r\n return Promise.resolve([]);\r\n }\r\n\r\n const todo = queue.items.slice();\r\n const results: T[] = [];\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: T;\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\n\r\nconst RADIUS = 2;\r\nconst ITERATIONS = 2;\r\n\r\nconst isFilterAvailable = 'filter' in (document.createElement('canvas').getContext('2d') || {});\r\nlet requireBlurPromise: Promise;\r\nlet fastBlurFunc: typeof fastBlur;\r\nif(!isFilterAvailable) {\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(img: HTMLImageElement, radius: number, iterations: number) {\r\n return new Promise((resolve) => {\r\n const canvas = document.createElement('canvas');\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(isFilterAvailable) {\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 resolve(canvas.toDataURL());\r\n /* if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n } */\r\n\r\n /* canvas.toBlob(blob => {\r\n resolve(URL.createObjectURL(blob));\r\n \r\n if(DEBUG) {\r\n console.log(`[blur] end, radius: ${radius}, iterations: ${iterations}, time: ${performance.now() - perf}`);\r\n }\r\n }); */\r\n });\r\n}\r\n\r\nconst blurPromises: Map> = new Map();\r\nconst CACHE_SIZE = 1000;\r\n\r\nexport default function blur(dataUri: string, radius: number = RADIUS, iterations: number = ITERATIONS) {\r\n if(!dataUri) {\r\n console.error('no dataUri for blur', dataUri);\r\n return Promise.resolve(dataUri);\r\n }\r\n\r\n if(blurPromises.size > CACHE_SIZE) {\r\n blurPromises.clear();\r\n }\r\n \r\n if(blurPromises.has(dataUri)) return blurPromises.get(dataUri);\r\n const 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(isFilterAvailable) {\r\n processBlurNext(img, radius, iterations).then(resolve);\r\n } else {\r\n addHeavyTask({\r\n items: [[img, radius, iterations]],\r\n context: null,\r\n process: processBlurNext\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n });\r\n }\r\n };\r\n img.src = dataUri;\r\n\r\n /* addHeavyTask({\r\n items: [[dataUri, radius, iterations]],\r\n context: null,\r\n process: processBlur\r\n }, 'unshift').then(results => {\r\n resolve(results[0]);\r\n }); */\r\n });\r\n });\r\n\r\n blurPromises.set(dataUri, promise);\r\n\r\n return promise;\r\n}\r\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\r\nexport default function htmlToDocumentFragment(html: string) {\r\n var 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","/*\r\n * https://github.com/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 shortTitle = limitSymbols(shortTitle, 80, 100);\r\n\r\n apiWebPage.rTitle = RichTextProcessor.wrapRichText(shortTitle, {noLinks: true, noLinebreaks: true});\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\r\n // delete apiWebPage.description\r\n const shortDescriptionText = limitSymbols(apiWebPage.description || '', 150, 180);\r\n apiWebPage.rDescription = RichTextProcessor.wrapRichText(shortDescriptionText, {\r\n contextSite: siteName || 'external',\r\n contextHashtag: contextHashtag\r\n });\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 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","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/7.e438432370239fd6ae1d.chunk.js b/public/7.0df5f895e8235966714f.chunk.js similarity index 57% rename from public/7.e438432370239fd6ae1d.chunk.js rename to public/7.0df5f895e8235966714f.chunk.js index 92562c07..fb137488 100644 --- a/public/7.e438432370239fd6ae1d.chunk.js +++ b/public/7.0df5f895e8235966714f.chunk.js @@ -1,2 +1,2 @@ -(this.webpackJsonp=this.webpackJsonp||[]).push([[7],{192: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","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.e438432370239fd6ae1d.chunk.js.map \ No newline at end of file +(this.webpackJsonp=this.webpackJsonp||[]).push([[7],{192: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.0df5f895e8235966714f.chunk.js.map \ No newline at end of file diff --git a/public/7.0df5f895e8235966714f.chunk.js.map b/public/7.0df5f895e8235966714f.chunk.js.map new file mode 100644 index 00000000..a3c8ed98 --- /dev/null +++ b/public/7.0df5f895e8235966714f.chunk.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/lang.ts"],"names":[],"mappings":"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","file":"7.0df5f895e8235966714f.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/7.e438432370239fd6ae1d.chunk.js.map b/public/7.e438432370239fd6ae1d.chunk.js.map deleted file mode 100644 index e7e8e32a..00000000 --- a/public/7.e438432370239fd6ae1d.chunk.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/lang.ts"],"names":[],"mappings":"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","file":"7.e438432370239fd6ae1d.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\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/changelogs/0.8.6.md b/public/changelogs/en_0.8.6.md similarity index 100% rename from public/changelogs/0.8.6.md rename to public/changelogs/en_0.8.6.md diff --git a/public/changelogs/0.9.0.md b/public/changelogs/en_0.9.0.md similarity index 100% rename from public/changelogs/0.9.0.md rename to public/changelogs/en_0.9.0.md diff --git a/public/changelogs/0.9.1.md b/public/changelogs/en_0.9.1.md similarity index 100% rename from public/changelogs/0.9.1.md rename to public/changelogs/en_0.9.1.md diff --git a/public/changelogs/0.9.2.md b/public/changelogs/en_0.9.2.md similarity index 100% rename from public/changelogs/0.9.2.md rename to public/changelogs/en_0.9.2.md diff --git a/public/changelogs/1.0.0.md b/public/changelogs/en_1.0.0.md similarity index 100% rename from public/changelogs/1.0.0.md rename to public/changelogs/en_1.0.0.md diff --git a/public/changelogs/1.0.5.md b/public/changelogs/en_1.0.5.md similarity index 100% rename from public/changelogs/1.0.5.md rename to public/changelogs/en_1.0.5.md diff --git a/public/changelogs/1.0.6.md b/public/changelogs/en_1.0.6.md similarity index 100% rename from public/changelogs/1.0.6.md rename to public/changelogs/en_1.0.6.md diff --git a/public/changelogs/1.1.0.md b/public/changelogs/en_1.1.0.md similarity index 100% rename from public/changelogs/1.1.0.md rename to public/changelogs/en_1.1.0.md diff --git a/public/changelogs/1.1.1.md b/public/changelogs/en_1.1.1.md similarity index 100% rename from public/changelogs/1.1.1.md rename to public/changelogs/en_1.1.1.md diff --git a/public/changelogs/1.2.0.md b/public/changelogs/en_1.2.0.md similarity index 100% rename from public/changelogs/1.2.0.md rename to public/changelogs/en_1.2.0.md diff --git a/public/changelogs/1.3.0.md b/public/changelogs/en_1.3.0.md similarity index 100% rename from public/changelogs/1.3.0.md rename to public/changelogs/en_1.3.0.md diff --git a/public/changelogs/1.4.0.md b/public/changelogs/en_1.4.0.md similarity index 100% rename from public/changelogs/1.4.0.md rename to public/changelogs/en_1.4.0.md diff --git a/public/changelogs/1.4.1.md b/public/changelogs/en_1.4.1.md similarity index 100% rename from public/changelogs/1.4.1.md rename to public/changelogs/en_1.4.1.md diff --git a/public/changelogs/en_1.4.2.md b/public/changelogs/en_1.4.2.md new file mode 100644 index 00000000..779dc1b8 --- /dev/null +++ b/public/changelogs/en_1.4.2.md @@ -0,0 +1,14 @@ +• 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)__. +• Replies in Forwarded Messages – reply previews are now included when **forwarding messages** to other chats, so everyone can see the full context of your inside jokes. +• From your chat list, hit the `ESC` key and instantly start typing in Search. +• Search inputs now transliterate between Latin and Cyrillic keyboards – when searching for your friend __Ivan__ you can type __Шмфт__ and the app will know what you meant. +• Along with other Telegram apps, WebK now shows `FAKE` and `SCAM` badges for suspicious chats. + +• `Monospace text` has an improved font with a cleaner look. You can also copy with a tap or click instantly. +• Using the ⬇️ button to jump to the end of a chat now has an animated transition. +• Try the reworked **Chat Backgrounds**: dark patterns now render faster and instantly resize. + +• Issues with messages marked as read automatically and deleting voice messages in Shared Media have been fixed. + +•*WebK** now has an [official channel](http://t.me/WebK_en) – where we will cover important news, updates and more about the app in English (For Russian, [press 2](http://t.me/WebK_ru)). diff --git a/public/changelogs/ru_1.4.2.md b/public/changelogs/ru_1.4.2.md new file mode 100644 index 00000000..e4c4f3dd --- /dev/null +++ b/public/changelogs/ru_1.4.2.md @@ -0,0 +1,14 @@ +• Видеопроигрыватель теперь поддерживает режим **«картинка в картинке»** – видео останется перед глазами, даже если Вы перейдёте в другую беседу. Для вызова режима откройте видео, далее кликните или коснитесь кнопки в правом нижнем углу проигрывателя. +• Любителей слушать музыку в Telegram порадуют два нововведения музыкального проигрывателя – **режим повтора песни** и возможность воспроизводить плейлисты в **обратном порядке**. Кроме того, проигрыватель теперь **запоминает** Ваши предпочтения __(уровень громкости, режим повтора, а также скорость воспроизведения)__. +• Сохранение ответов при пересылке – возможность быстро переместиться к исходному сообщению появилась и при **пересылке ответа** в другие чаты. Шутку не придется объяснять, если сразу добавить контекст. +• В настольных браузерах касание кнопки `ESC` откроет поиск – начинайте набор моментально. +• Не беда, если забыли переключиться с латиницы на кириллицу при поиске, WebK поймёт, что __Bdfy – это Иван__. +• Как и в остальных приложениях Telegram, метки `SCAM` и `FAKE` теперь отображаются на подозрительных чатах и каналах. + +• `Моноширинный текст` получил новый шрифт. Моментально копируйте текст с таким форматированием по клику или касанию. +• Прокрутка истории чата вниз через кнопку ⬇️ теперь анимируется. +• **Фоны для чатов** были улучшены – узоры в тёмных фонах быстрее отрисовываются и моментально перестраиваются, если Вы меняете размер окна браузера. + +• Исправлены недоработки с автоматическим прочтением сообщений и удалением голосовых заметок из вкладки Общие Медиа. + +У **WebK** появился [официальный канал](http://t.me/WebK_ru) – в нём рассказываем о приложении на русском языке (For English, [press 1](http://t.me/WebK_en)). diff --git a/public/index.html b/public/index.html index 13de2d8b..ee71e875 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.246a2689821bf26a9583.css b/public/main.246a2689821bf26a9583.css new file mode 100644 index 00000000..97db0a99 --- /dev/null +++ b/public/main.246a2689821bf26a9583.css @@ -0,0 +1,4 @@ +/*! 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 2px 8px 1px var(--menu-box-shadow-color);--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, .24);--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?1mzumm") format("truetype"),url("assets/fonts/tgico.woff?1mzumm") format("woff"),url("assets/fonts/tgico.svg?1mzumm#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:background-color .2s ease-in-out,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:#fff;background-color:var(--surface-color);z-index:3;top:100%;padding:.5rem 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-user-select:none;-webkit-touch-callout:none}.btn-menu{box-shadow:0px 2px 8px 1px rgba(0, 0, 0, .24);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:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !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: 1rem;--padding-right: 2.5rem;--icon-margin: 1.5rem;--icon-size: 1.5rem;display:flex;position:relative;padding:0 var(--padding-right) 0 var(--padding-left);height:3rem;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;line-height:1.3125;line-height:var(--line-height)}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:#707579;color:var(--secondary-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{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:#3390ec;color:var(--primary-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;background:#f4f4f5;background:var(--background-color-true);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-reactions{--inner-shadow-degree: 90deg;max-width:100%;max-height:100%;height:inherit;border-radius:var(--height);background-color:#fff;background-color:var(--surface-color);position:absolute;opacity:0;transform:scale(0.8)}.btn-menu-reactions-container{--height: 2.625rem;--bubble-side-offset: -2.25rem;--other-side-offset: -1.5rem;--width: calc(100% + (var(--bubble-side-offset) + var(--other-side-offset)) * -1);position:absolute;top:calc((var(--height) + .5rem) * -1);width:var(--width);max-width:var(--width);left:var(--other-side-offset);display:flex;justify-content:flex-end;height:var(--height)}.btn-menu-reactions-container-vertical{top:var(--other-side-offset);left:calc((var(--height) + .5rem) * -1);width:var(--height);height:var(--width);max-width:var(--height);max-height:var(--width);flex-direction:column}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree: 180deg;width:inherit;height:auto;display:flex;flex-direction:column}.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.75rem;--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 .contextmenu{box-shadow:none !important;filter:drop-shadow(0 0.125rem 0.5rem rgba(0, 0, 0, .24));filter:drop-shadow(0 0.125rem 0.5rem var(--menu-box-shadow-color))}.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% + 1.0625rem);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.5rem;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:#3390ec;stroke:var(--primary-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-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: -.25rem;content:" ";position:absolute;top:var(--offset);right:var(--offset);bottom:var(--offset);left:var(--offset);border:.125rem solid #3390ec;border:.125rem 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}.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 2px 8px 1px rgba(0, 0, 0, .24);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 svg{width:22px;height:22px}.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:1rem}#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::-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:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-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(21px / 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-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:.25s ease-in-out;transition: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}@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)}.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-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled: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.246a2689821bf26a9583.css.map*/ \ No newline at end of file diff --git a/public/main.246a2689821bf26a9583.css.map b/public/main.246a2689821bf26a9583.css.map new file mode 100644 index 00000000..6666f4ff --- /dev/null +++ b/public/main.246a2689821bf26a9583.css.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///./src/materialize.scss","webpack:///./src/scss/style.scss"],"names":[],"mappings":"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","file":"main.246a2689821bf26a9583.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 2px 8px 1px var(--menu-box-shadow-color);--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, .24);--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?1mzumm\") format(\"truetype\"),url(\"assets/fonts/tgico.woff?1mzumm\") format(\"woff\"),url(\"assets/fonts/tgico.svg?1mzumm#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:background-color .2s ease-in-out,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:#fff;background-color:var(--surface-color);z-index:3;top:100%;padding:.5rem 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-user-select:none;-webkit-touch-callout:none}.btn-menu{box-shadow:0px 2px 8px 1px rgba(0, 0, 0, .24);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:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !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: 1rem;--padding-right: 2.5rem;--icon-margin: 1.5rem;--icon-size: 1.5rem;display:flex;position:relative;padding:0 var(--padding-right) 0 var(--padding-left);height:3rem;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;line-height:1.3125;line-height:var(--line-height)}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:#707579;color:var(--secondary-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{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:#3390ec;color:var(--primary-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;background:#f4f4f5;background:var(--background-color-true);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-reactions{--inner-shadow-degree: 90deg;max-width:100%;max-height:100%;height:inherit;border-radius:var(--height);background-color:#fff;background-color:var(--surface-color);position:absolute;opacity:0;transform:scale(0.8)}.btn-menu-reactions-container{--height: 2.625rem;--bubble-side-offset: -2.25rem;--other-side-offset: -1.5rem;--width: calc(100% + (var(--bubble-side-offset) + var(--other-side-offset)) * -1);position:absolute;top:calc((var(--height) + .5rem) * -1);width:var(--width);max-width:var(--width);left:var(--other-side-offset);display:flex;justify-content:flex-end;height:var(--height)}.btn-menu-reactions-container-vertical{top:var(--other-side-offset);left:calc((var(--height) + .5rem) * -1);width:var(--height);height:var(--width);max-width:var(--height);max-height:var(--width);flex-direction:column}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree: 180deg;width:inherit;height:auto;display:flex;flex-direction:column}.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.75rem;--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 .contextmenu{box-shadow:none !important;filter:drop-shadow(0 0.125rem 0.5rem rgba(0, 0, 0, .24));filter:drop-shadow(0 0.125rem 0.5rem var(--menu-box-shadow-color))}.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% + 1.0625rem);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.5rem;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:#3390ec;stroke:var(--primary-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-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: -.25rem;content:\" \";position:absolute;top:var(--offset);right:var(--offset);bottom:var(--offset);left:var(--offset);border:.125rem solid #3390ec;border:.125rem 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}.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 2px 8px 1px rgba(0, 0, 0, .24);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 svg{width:22px;height:22px}.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:1rem}#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::-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:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-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(21px / 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-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:.25s ease-in-out;transition: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}@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)}.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-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled: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.4a428d15159ecb0287a0.css b/public/main.4a428d15159ecb0287a0.css deleted file mode 100644 index ad2bc1b2..00000000 --- a/public/main.4a428d15159ecb0287a0.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 2px 8px 1px var(--menu-box-shadow-color);--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, .24);--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;--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;--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?1mzumm") format("truetype"),url("assets/fonts/tgico.woff?1mzumm") format("woff"),url("assets/fonts/tgico.svg?1mzumm#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:""}@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:background-color .2s ease-in-out,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:#fff;background-color:var(--surface-color);z-index:3;top:100%;padding:.5rem 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-user-select:none;-webkit-touch-callout:none}.btn-menu{box-shadow:0px 2px 8px 1px rgba(0, 0, 0, .24);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:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !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: 1rem;--padding-right: 2.5rem;--icon-margin: 1.5rem;--icon-size: 1.5rem;display:flex;position:relative;padding:0 var(--padding-right) 0 var(--padding-left);height:3rem;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;line-height:1.3125;line-height:var(--line-height)}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:#707579;color:var(--secondary-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{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:#3390ec;color:var(--primary-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;background:#f4f4f5;background:var(--background-color-true);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-reactions{--inner-shadow-degree: 90deg;max-width:100%;max-height:100%;height:inherit;border-radius:var(--height);background-color:#fff;background-color:var(--surface-color);position:absolute;opacity:0;transform:scale(0.8)}.btn-menu-reactions-container{--height: 2.625rem;--bubble-side-offset: -2.25rem;--other-side-offset: -1.5rem;--width: calc(100% + (var(--bubble-side-offset) + var(--other-side-offset)) * -1);position:absolute;top:calc((var(--height) + .5rem) * -1);width:var(--width);max-width:var(--width);left:var(--other-side-offset);display:flex;justify-content:flex-end;height:var(--height)}.btn-menu-reactions-container-vertical{top:var(--other-side-offset);left:calc((var(--height) + .5rem) * -1);width:var(--height);height:var(--width);max-width:var(--height);max-height:var(--width);flex-direction:column}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree: 180deg;width:inherit;height:auto;display:flex;flex-direction:column}.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.75rem;--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;visibility:visible;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:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-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;visibility:hidden}.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;visibility:hidden}.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: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 .contextmenu{box-shadow:none !important;filter:drop-shadow(0 0.125rem 0.5rem rgba(0, 0, 0, .24));filter:drop-shadow(0 0.125rem 0.5rem var(--menu-box-shadow-color))}.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% + 1.0625rem);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.5rem;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:#3390ec;stroke:var(--primary-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-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: -.25rem;content:" ";position:absolute;top:var(--offset);right:var(--offset);bottom:var(--offset);left:var(--offset);border:.125rem solid #3390ec;border:.125rem 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}.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 2px 8px 1px rgba(0, 0, 0, .24);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 svg{width:22px;height:22px}.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}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.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).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):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}.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-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:1rem}#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::-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:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-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(21px / 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-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:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:"";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: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: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:.25s ease-in-out;transition: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}@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)}.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-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled: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.4a428d15159ecb0287a0.css.map*/ \ No newline at end of file diff --git a/public/main.4a428d15159ecb0287a0.css.map b/public/main.4a428d15159ecb0287a0.css.map deleted file mode 100644 index 6659dd72..00000000 --- a/public/main.4a428d15159ecb0287a0.css.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///./src/materialize.scss","webpack:///./src/scss/style.scss"],"names":[],"mappings":"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","file":"main.4a428d15159ecb0287a0.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 2px 8px 1px var(--menu-box-shadow-color);--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, .24);--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;--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;--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?1mzumm\") format(\"truetype\"),url(\"assets/fonts/tgico.woff?1mzumm\") format(\"woff\"),url(\"assets/fonts/tgico.svg?1mzumm#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:\"\"}@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:background-color .2s ease-in-out,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:#fff;background-color:var(--surface-color);z-index:3;top:100%;padding:.5rem 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-user-select:none;-webkit-touch-callout:none}.btn-menu{box-shadow:0px 2px 8px 1px rgba(0, 0, 0, .24);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:not(.active),.btn-menu:not(.active) .btn-menu-item{pointer-events:none !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: 1rem;--padding-right: 2.5rem;--icon-margin: 1.5rem;--icon-size: 1.5rem;display:flex;position:relative;padding:0 var(--padding-right) 0 var(--padding-left);height:3rem;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;line-height:1.3125;line-height:var(--line-height)}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:#707579;color:var(--secondary-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{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:#3390ec;color:var(--primary-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;background:#f4f4f5;background:var(--background-color-true);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-reactions{--inner-shadow-degree: 90deg;max-width:100%;max-height:100%;height:inherit;border-radius:var(--height);background-color:#fff;background-color:var(--surface-color);position:absolute;opacity:0;transform:scale(0.8)}.btn-menu-reactions-container{--height: 2.625rem;--bubble-side-offset: -2.25rem;--other-side-offset: -1.5rem;--width: calc(100% + (var(--bubble-side-offset) + var(--other-side-offset)) * -1);position:absolute;top:calc((var(--height) + .5rem) * -1);width:var(--width);max-width:var(--width);left:var(--other-side-offset);display:flex;justify-content:flex-end;height:var(--height)}.btn-menu-reactions-container-vertical{top:var(--other-side-offset);left:calc((var(--height) + .5rem) * -1);width:var(--height);height:var(--width);max-width:var(--height);max-height:var(--width);flex-direction:column}.btn-menu-reactions-container-vertical .btn-menu-reactions{--inner-shadow-degree: 180deg;width:inherit;height:auto;display:flex;flex-direction:column}.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.75rem;--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;visibility:visible;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:visibility .2s cubic-bezier(.4, .0, .2, 1),opacity .2s cubic-bezier(.4, .0, .2, 1);transition:visibility var(--layer-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;visibility:hidden}.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;visibility:hidden}.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: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 .contextmenu{box-shadow:none !important;filter:drop-shadow(0 0.125rem 0.5rem rgba(0, 0, 0, .24));filter:drop-shadow(0 0.125rem 0.5rem var(--menu-box-shadow-color))}.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% + 1.0625rem);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.5rem;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:#3390ec;stroke:var(--primary-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-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: -.25rem;content:\" \";position:absolute;top:var(--offset);right:var(--offset);bottom:var(--offset);left:var(--offset);border:.125rem solid #3390ec;border:.125rem 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}.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 2px 8px 1px rgba(0, 0, 0, .24);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 svg{width:22px;height:22px}.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}.bubble.webpage .document{height:3.375rem}@media only screen and (max-width: 600px){.bubble.webpage .document{padding-left:44px}}.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).hide-name .reply,.bubble:not(.sticker):not(.emoji-big):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}.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-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:1rem}#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::-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:thin;-ms-overflow-style:none}.scrollable.scrollable-y{overflow-y:auto;overflow-y:overlay;scrollbar-width:thin;-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(21px / 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-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:bold;font-size:.75rem;opacity:1;display:flex;align-items:center;justify-content:center}poll-element .poll-answer-selected:before{content:\"\";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: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: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:.25s ease-in-out;transition: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}@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)}.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-reply:before,.tgico-attach:before,.tgico-saved:before,.tgico-phone:before,.tgico-admin:before,.tgico-message:before,.tgico-fontsize:before,.tgico-forward:before,.tgico-reply_filled:before,.tgico-forward_filled: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.5be7f9ad8fda8c3f79cf.bundle.js.map b/public/main.5be7f9ad8fda8c3f79cf.bundle.js.map deleted file mode 100644 index 2bc9702c..00000000 --- a/public/main.5be7f9ad8fda8c3f79cf.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/lib/appManagers/appRuntimeManager.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/config/emoji.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/helpers/string/encodeEntities.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/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/cancelEvent.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/peerIdPolyfill.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/index.ts","webpack:///./src/helpers/dom/toggleAttributePolyfill.ts","webpack:///./src/helpers/setWorkerProxy.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","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","format","plain","str","select","item","Node","join","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","timeFormat","IntlDateElement","getStrings","invokeApi","_Intl","assign","WeakMap","IntlElementBase","options","add","date","IntlElement","safeAssign","formatted","dataset","deepEqual","dateTimeFormat","json","DateTimeFormat","getDateTimeFormat","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","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","focus","compareVersion","v1","v2","s1","s2","EmojiVersions","Emoji","encodeEntities","charCodeAt","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","wrapRichText","lol","passEntities","contextSite","contextExternal","insertPart","startPart","endPart","startOffset","endOffset","startIndex","endIndex","part","pushPartsAfterSort","textLength","noTextFormat","wrappingDraft","noLinks","bot","atPos","command","fromBot","encodeURIComponent","isSupported","html","entityText","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","username","before","spoilerBefore","after","spoiler","partsLength","pushPartsAfterSortLength","insertAt","usedLength","sliced","noEncoding","urlLength","urlOpenBrackets","urlCloseBrackets","chars","charsLength","char","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","fullPath","path","getEmojiEntityFromEmoji","emoji","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","wrapPlainText","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","preventDefault","lastFocusOutTimeStamp","timeStamp","touchStart","activeElement","blur","fixSafariStickyInputFocusing","fixSafariStickyInput","transform","cancelEvent","originalEvent","stopPropagation","returnValue","cancelBubble","findUpClassName","className","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","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","hour","minute","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","textTransform","formatFullSentTime","fragment","createDocumentFragment","getFullDate","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","setHours","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","toChatId","isChat","isPeerId","Number","abs","onFinally","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","height","innerHeight","setProperty","workerProxy","Proxy","construct","setWorkerProxy","toggleResizeMode","tabId","wasTabId","tagName","langPromise","getState","fadeInWhenFontsReady","elem","opacity","setThemeListener","getElementById","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","mount","sentCode","authCode"],"mappings":"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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,E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","file":"main.5be7f9ad8fda8c3f79cf.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\":\"50ca39d9514acbfe6a6a\",\"1\":\"1fbe64f8013ab3be0499\",\"2\":\"67fe5109f1ffeaa937f9\",\"3\":\"f43eeadba6063db40ad3\",\"4\":\"91c33794543af8f50348\",\"5\":\"8ea7ea01378265598d5f\",\"6\":\"7ffd20da266d386fcaec\",\"7\":\"e438432370239fd6ae1d\",\"8\":\"02a6c8937bbd384c2467\",\"10\":\"80cef69985dcb7541efc\",\"11\":\"485cff055ef366a5dc5a\",\"12\":\"98f15505a7862a1f5623\",\"13\":\"5f88e9579f7a932dfad4\",\"14\":\"d15027c531ca1671a9e3\",\"15\":\"59dc38a60e45ddb6327a\",\"16\":\"1163d3ba587800ecae20\",\"17\":\"f7254c2398a46332f31d\",\"18\":\"045ea4aeee8c09bb86f6\",\"19\":\"963fd24da8d461207246\",\"20\":\"56a736e3dc441023f4f8\",\"21\":\"f29643148b4ebe90e4ca\",\"22\":\"c0ac3c204b1397aea626\",\"23\":\"81a67a70b9b28e4f121f\",\"24\":\"42ebbd3ee500042019ef\"}[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 = 55);\n","/*\n * 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 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': {doc: MyDocument, message: Message.message, media: HTMLMediaElement},\n 'media_pause': void,\n 'media_playback_params': {volume: number, muted: boolean, playbackRate: number, loop: boolean, round: boolean},\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 export function setTimeFormat(format: State['settings']['timeFormat']) {\n const haveToUpdate = !!timeFormat && timeFormat !== format;\n timeFormat = format;\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\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',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\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 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\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\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\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\t//var options = { month: 'long', day: 'numeric' };\n\t\t\t\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n\t\t\tconst dateTimeFormat = getDateTimeFormat(this.options);\n\t\t\t\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\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.a82172768f4f413f9db0.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 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","/*\r\n * https://github.com/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","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","/*\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","// 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","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 * 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 { 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 /**\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 }> = {}) {\n if(!text) {\n return '';\n }\n\n const lol: {\n part: string,\n offset: number,\n // priority: number\n }[] = [];\n const entities = options.entities || parseEntities(text);\n\n const passEntities: typeof options.passEntities = options.passEntities || {};\n const contextSite = options.contextSite || 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const insertPart = (entity: MessageEntity, startPart: string, endPart?: string/* , priority = 0 */) => {\n const startOffset = entity.offset, endOffset = endPart ? entity.offset + entity.length : undefined;\n let startIndex: number, endIndex: number, length = lol.length;\n for(let i = length - 1; i >= 0; --i) {\n const offset = lol[i].offset;\n\n if(startIndex === undefined && startOffset >= offset) {\n startIndex = i + 1;\n }\n\n if(endOffset !== undefined) {\n if(endOffset <= offset) {\n endIndex = i;\n }\n }\n\n if(startOffset > offset && (endOffset === undefined || endOffset < offset)) {\n break;\n }\n }\n\n startIndex ??= 0;\n lol.splice(startIndex, 0, {part: startPart, offset: entity.offset/* , priority */});\n\n if(endOffset !== undefined) {\n endIndex ??= startIndex;\n ++endIndex;\n lol.splice(endIndex, 0, {part: endPart, offset: entity.offset + entity.length/* , priority */});\n }\n };\n\n const pushPartsAfterSort: typeof lol = [];\n const textLength = text.length;\n for(let i = 0, length = entities.length; i < length; ++i) {\n let entity = entities[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 switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\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 insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n \n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n \n break;\n }\n \n case 'messageEntityPre': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, `
`, '
');\n }\n \n break;\n }\n\n case 'messageEntityHighlight': {\n insertPart(entity, '', '');\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n const entityText = text.substr(entity.offset, entity.length);\n let command = entityText.substr(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.substr(atPos + 1);\n command = command.substr(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n insertPart(entity, `
`, ``);\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 insertPart(entity, `\"`,`);\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n insertPart(entity, '', '');\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 const html = '';\n // const html = '';\n // insertPart(entity, '');\n // insertPart(entity, '');\n pushPartsAfterSort.push({part: html, offset: entity.offset});\n // insertPart(entity, html/* , undefined, 1 */);\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 const entityText = text.substr(entity.offset, entity.length);\n\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || entityText;\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 const nextEntity = entities[i + 1];\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n i++;\n }\n\n if(url !== entityText) {\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 ? encodeEntities(url)\n : `javascript:electronHelpers.openExternal('${encodeEntities(url)}');`;\n\n const target = (currentContext || typeof electronHelpers !== 'undefined')\n ? '' : ' target=\"_blank\" rel=\"noopener noreferrer\"';\n\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const entityText = text.substr(entity.offset, entity.length);\n const hashtag = entityText.substr(1);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n const username = entityText.substr(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n // insertPart(entity, ``, '');\n insertPart(entity, ``, '');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const after = text.slice(entity.offset + entity.length);\n text = before + spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */ + after;\n } else if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n \n break;\n }\n }\n }\n\n // lol.sort((a, b) => (a.offset - b.offset) || (a.priority - b.priority));\n // lol.sort((a, b) => a.offset - b.offset); // have to sort because of nested entities\n\n let partsLength = lol.length, pushPartsAfterSortLength = pushPartsAfterSort.length;\n for(let i = 0; i < pushPartsAfterSortLength; ++i) {\n const part = pushPartsAfterSort[i];\n let insertAt = 0;\n while(insertAt < partsLength) {\n if(lol[insertAt++].offset >= part.offset) {\n break;\n }\n }\n\n lol.splice(insertAt, 0, part);\n }\n\n partsLength += pushPartsAfterSortLength;\n\n const arr: string[] = [];\n let usedLength = 0;\n for(let i = 0; i < partsLength; ++i) {\n const {part, offset} = lol[i];\n if(offset > usedLength) {\n const sliced = text.slice(usedLength, offset);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n usedLength = offset;\n }\n\n arr.push(part);\n }\n\n if(usedLength < text.length) {\n const sliced = text.slice(usedLength);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n }\n\n return arr.join('');\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 '';\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 });\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return '';\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","/*\n * 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 * 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","/*\n * 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 { NULL_PEER_ID, UserAuth } from '../mtproto/mtproto_config';\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 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 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 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\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 }\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\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 if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\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","/*\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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/main.5be7f9ad8fda8c3f79cf.bundle.js b/public/main.df631e4b57ec50c6de09.bundle.js similarity index 84% rename from public/main.5be7f9ad8fda8c3f79cf.bundle.js rename to public/main.df631e4b57ec50c6de09.bundle.js index 27308ea1..911834b6 100644 --- a/public/main.5be7f9ad8fda8c3f79cf.bundle.js +++ b/public/main.df631e4b57ec50c6de09.bundle.js @@ -1,2 +1,2 @@ -!function(f){function e(e){for(var d,s,n=e[0],a=e[1],i=0,c=[];i{}},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 i=new a;n.a.rootScope=i,e.a=i},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 i})),d.d(e,"g",(function(){return c})),d.d(e,"d",(function(){return r})),d.d(e,"f",(function(){return o})),d.d(e,"e",(function(){return u}));var t=d(29);const s=navigator?navigator.userAgent:null,n=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),a=-1!==navigator.userAgent.toLowerCase().indexOf("android"),i=(/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!t.a.MSStream),c=!!("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=c&&i,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 i=[t.None,t.Error,t.Warn,t.Log,t.Debug],c=Date.now();function r(){return"["+((Date.now()-c)/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 c;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){c=e,f="["+e+"]"},u.setPrefix(f),u.setLevel=function(f){e=i.slice(0,f+1).reduce((f,e)=>f|e,0)},u.bindPrefix=function(f){return p(`${c}] [${f}`,e,d,o)},u}},function(f,e,d){"use strict";const t={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.4.1",versionFull:"1.4.1 (160)",build:160,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 i{constructor(){this.taskId=0,this.tasks={},i.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)}}i.STORAGES=[];const c=new i;t.a.appStorage=c;e.a=c},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),i=d(0),c=d(27),r=d(2),o=d(40),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(){const e=a.a.langPackCode;return f.lastRequestedLangCode=e,Promise.all([d.e(7).then(d.bind(null,192)),d.e(8).then(d.bind(null,193)),d.e(21).then(d.bind(null,194))]).then(([f,d,t])=>{const s=[];h(f.default,s),h(d.default,s);return m({_:"langPackDifference",from_version:0,lang_code:e,strings:s,version:0,local:!0,countries:t.default})})}function b(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,192)),d.e(8).then(d.bind(null,193)),s.a.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function h(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 g(e){return f.lastRequestedLangCode=e,b(e).then(([f,e,d,t,s,n])=>{let a=[];[d,t].forEach(f=>{h(f.default,a)}),a=a.concat(f.strings);for(const f of e.strings)a.push(f);return f.strings=a,f.countries=s,m(f)})}function m(f){return f.appVersion=a.a.langPackVersion,n.a.set({langPack:f}).then(()=>(p(f),f))}function p(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&&(i.a.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code,E.clear());Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d&&d.update()})}function v(f,e,d={i:0}){let t=[];let s=0;return f.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,(f,n,a,i,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(...v(a,e,d)),t.push(f)}else if(i)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&&c.b.matchUrlProtocol(n)){a=document.createElement("a");const f=c.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(...v(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 y(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 i=v(a,s);return t?i.map(f=>f instanceof Node?f.textContent:f).join(""):i}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),p(e),e):l()).finally(()=>{r=void 0}))},f.setTimeFormat=function(e){const d=!!f.timeFormat&&f.timeFormat!==e;if(f.timeFormat=e,d){E.clear();Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d instanceof S&&d.update()})}},f.loadLocalLangPack=l,f.loadLangPack=b,f.getStrings=function(f,e){return s.a.invokeApi("langpack.getStrings",{lang_pack:a.a.langPack,lang_code:f,keys:e})},f.formatLocalStrings=h,f.getLangPack=g,f.saveLangPack=m,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(22).then(d.bind(null,195)).then(f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)}),f.applyLangPack=p,f.superFormatter=v,f.format=y,f.weakMap=new WeakMap;class k{constructor(e){this.property="innerHTML",this.element=(null==e?void 0:e.element)||document.createElement("span"),this.element.classList.add("i18n"),e&&(e.key||e.date)&&this.update(e),f.weakMap.set(this.element,this)}}class w extends k{update(f){if(Object(u.a)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const f=this.element[this.property],e=y(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=w;const E=new Map;class S extends k{update(e){Object(u.a)(this,e);const d=function(e={}){let d=JSON.stringify(e),t=E.get(d);return t||E.set(d,t=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,e)),t}(this.options);var t;this.element[this.property]=(t=d.format(this.date)).charAt(0).toUpperCase()+t.slice(1)}}f.IntlDateElement=S,f.i18n=function(f,e){return new w({key:f,args:e}).element},f.i18n_=function(f){return new w(f).element},f._i18n=function(f,e,d,t){return new w({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.a82172768f4f413f9db0.bundle.worker.js")}var s=d(4),n=d(0),a=d(52),i=d(1),c=d(9),r=d(15);class o extends r.a{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=c.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(49),l=d(6),b=d(50),h=d(12),g=d(24),m=d(47),p=d(16),v=d(45),y=d(43),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=i.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 i;return this.hashes[n]&&(i=this.hashes[n][a],i&&(t.hash=i.hash)),this.invokeApiSingleProcess({method:n,processResult:e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",n,a),i.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:i,options:c}=f,r=this.apiPromisesSingleProcess,o=c.cacheKey||JSON.stringify(i),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,i,c).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 i;d.override&&(a&&a.timeout&&(clearTimeout(a.timeout),delete a.timeout),delete d.override),d.cacheSeconds&&(i=window.setTimeout(()=>{delete s[n]},1e3*d.cacheSeconds),delete d.cacheSeconds);const c=this.invokeApi(f,e,d);return s[n]={timestamp:Date.now(),fulfilled:!1,timeout:i,promise:c,params:e},c}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}};i.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(39);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(46),i=d(18),c=d(4);class r{constructor(f,e){this.storageIsAvailable=!0,Object(i.a)(this,f),n.a.test&&(this.name+="_test"),this.storeName=e,this.log=Object(c.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,i)=>{const c=n.transaction([t],f);c.onerror=f=>{clearTimeout(r),i(c.error)},c.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",c)},1e4),o=e(c.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{c(t.next(f))}catch(f){n(f)}}function i(f){try{c(t.throw(f))}catch(f){n(f)}}function c(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,i)}c((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)})})},i=(...f)=>{self.postMessage(...f)},c=()=>{},r=t?a.bind(null,!1):s?i:c;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(38);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,"d",(function(){return s})),d.d(e,"e",(function(){return n})),d.d(e,"b",(function(){return a})),d.d(e,"a",(function(){return i}));const t=0,s=1271266957,n=777e3,a=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";const t=new class{reload(){try{location.reload()}catch(f){}}close(){try{window.close()}catch(f){}}focus(){window.focus()}};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"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";").replace(/([^\#-~| |!])/g,f=>"&#"+f.charCodeAt(0)+";").replace(//g,">")}var r=d(26);var o=["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"];const u="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",l="["+u+"0-9]",b="((?:https?|ftp)://|mailto:)?(?:"+l+"{1,64}(?::"+l+"{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}|"+l+"["+u+"·0-9-]{0,64}(?:\\."+l+"["+u+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+u+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",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=P(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),i=[];let c,r=0;for(;c=f.match(p);){const e=r+c.index;i.push(f.substr(0,c.index));const d=c[3]||c[8]||c[11]||c[13];let t;if(r-=d.length,r+=d.length,s=!1,d.match(/^`*$/))i.push(c[0]);else if(c[3])t={_:"messageEntityPre",language:"",offset:e+c[1].length,length:d.length},a(t)&&("\n"===c[5]&&(c[5]="",r-=1),i.push(c[1]+d+c[5]),r-=c[2].length+c[4].length);else if(c[7]){const f=""===c[6];t={_:y[c[7]],offset:e+(f?0:c[6].length),length:d.length},a(t)&&(f?i.push(d):i.push(c[6]+d+c[9]),r-=2*c[7].length+(f?2:0))}else c[11]?(t={_:"messageEntityMentionName",user_id:c[10].toUserId(),offset:e,length:d.length},a(t)&&(i.push(d),r-=c[0].length-d.length)):c[12]&&(t={_:"messageEntityTextUrl",url:c[14],offset:e,length:d.length},a(t)&&(i.push(d),r-=c[12].length-d.length));s||i.push(c[0]),f=f.substr(c.index+c[0].length),r+=c.index+c[0].length}i.push(f);let o=i.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,e={}){if(!f)return"";const t=[],n=e.entities||d(f),o=e.passEntities||{},u=e.contextSite||"Telegram",l="Telegram"!==u,b=(f,e,d)=>{const s=f.offset,n=d?f.offset+f.length:void 0;let a,i;for(let f=t.length-1;f>=0;--f){const e=t[f].offset;if(void 0===a&&s>=e&&(a=f+1),void 0!==n&&n<=e&&(i=f),s>e&&(void 0===n||n=g){if("messageEntityCaret"!==t._)continue}else t.offset+t.length>g&&(t=Object(i.a)(t),t.length=t.offset+t.length-g);switch(t._){case"messageEntityBold":e.noTextFormat||(e.wrappingDraft?b(t,'',""):b(t,"",""));break;case"messageEntityItalic":e.noTextFormat||(e.wrappingDraft?b(t,'',""):b(t,"",""));break;case"messageEntityStrike":if(e.wrappingDraft){b(t,``,"")}else e.noTextFormat||b(t,"","");break;case"messageEntityUnderline":if(e.wrappingDraft){b(t,``,"")}else e.noTextFormat||b(t,"","");break;case"messageEntityCode":e.wrappingDraft?b(t,'',""):e.noTextFormat||b(t,"","");break;case"messageEntityPre":e.wrappingDraft?b(t,'',""):e.noTextFormat||b(t,`
`,"
");break;case"messageEntityHighlight":b(t,'',"");break;case"messageEntityBotCommand":if(!e.noLinks&&o[t._]){let d,s,n=f.substr(t.offset,t.length).substr(1);-1!==(s=n.indexOf("@"))?(d=n.substr(s+1),n=n.substr(0,s)):d=e.fromBot,b(t,``,"")}break;case"messageEntityEmoji":{let f=a.a;if(f)for(const e in r.a)if(e){if(r.a[e].hasOwnProperty(t.unicode)){f=!1;break}}f?e.wrappingDraft||b(t,'',""):b(t,``,'');break}case"messageEntityCaret":{const f='';h.push({part:f,offset:t.offset});break}case"messageEntityUrl":case"messageEntityTextUrl":if(!e.noLinks||o[t._]){const s=f.substr(t.offset,t.length);let a,i=t.url||s,r=!1;const o=T(i,!0);if(i=o.url,a=o.onclick,"messageEntityTextUrl"===t._){const f=n[d+1];"messageEntityUrl"===(null==f?void 0:f._)&&f.length===t.length&&f.offset===t.offset&&d++,i!==s&&(r=!0)}const u=!!a;a||!r||u||(a="showMaskedAlert"),e.wrappingDraft&&(a=void 0);b(t,``,"")}break;case"messageEntityEmail":if(!e.noLinks){b(t,``,"")}break;case"messageEntityHashtag":{const d=!e.noLinks&&v[u];if(d){const e=f.substr(t.offset,t.length).substr(1);b(t,``,"")}break}case"messageEntityMentionName":e.noLinks&&!o[t._]||b(t,`");break;case"messageEntityMention":if(!e.noLinks){const e=f.substr(t.offset,t.length).substr(1),{url:d,onclick:s}=T("t.me/"+e);b(t,``,"")}break;case"messageEntitySpoiler":if(e.noTextFormat){const e=f.slice(0,t.offset),d=f.slice(t.offset,t.offset+t.length),s=f.slice(t.offset+t.length);f=e+A(d)+s}else e.wrappingDraft?b(t,'',""):b(t,'',"")}}let m=t.length,p=h.length;for(let f=0;f=e.offset););t.splice(d,0,e)}m+=p;const y=[];let k=0;for(let d=0;dk){const d=f.slice(k,n);y.push(e.noEncoding?d:c(d)),k=n}y.push(s)}if(kd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function A(f){const e="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",d=e.length,t=[];for(let s=0;s"messageEntityEmoji"===f._),wrappingDraft:e})}function T(e,d){let t,s,n,a;if(_(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 _(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=S,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?S(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):""},f.checkBrackets=P,f.spoiler=A,f.wrapPlainText=function(f,e=[]){return(null==e?void 0:e.length)&&(e=e.filter(f=>"messageEntitySpoiler"===f._)),S(f,{entities:e,noEncoding:!0,noTextFormat:!0,noLinebreaks:!0,noLinks:!0})},f.wrapEmojiText=C,f.wrapUrl=T,f.matchUrlProtocol=_,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?C(t):C(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 S(f,{entities:[D(f)]})}}(w||(w={})),n.a.RichTextProcessor=w;e.b=w},function(f,e,d){"use strict";function t(f){return i(a(f)).join("-")}d.d(e,"b",(function(){return t})),d.d(e,"e",(function(){return i})),d.d(e,"d",(function(){return c})),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 i(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 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)),"")}},function(f,e,d){"use strict";const t="undefined"!=typeof window?window:self;e.a=t},function(f,e,d){"use strict";d.d(e,"a",(function(){return i})),d.d(e,"b",(function(){return c}));var t=d(14),s=d(2),n=d(33),a=d(31);const i=s.g&&s.e&&t.a;if(i){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,i=s.scrollTop,c=s.scrollHeight,r=s.clientHeight,o=i?Math.round(i+s.clientHeight+a):i+a;(c===r||o>=c||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 c(f){i&&f.classList.add("is-sticky-input-bugged")}},function(f,e,d){"use strict";d.d(e,"a",(function(){return s}));var t=d(35);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){if(f=f||window.event){f=f.originalEvent||f;try{f.stopPropagation&&f.stopPropagation(),f.preventDefault&&f.preventDefault(),f.returnValue=!1,f.cancelBubble=!0}catch(f){}}return!1}d.d(e,"a",(function(){return t}))},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),i=d(4),c=d(5),r=d(1),o=d(12),u=d(2),l=d(17),b=d(6),h=d(21),g=d(25);var m=d(3),p=d(44);var v=d(48),y=function(f,e,d,t){return new(d||(d=Promise))((function(s,n){function a(f){try{c(t.next(f))}catch(f){n(f)}}function i(f){try{c(t.throw(f))}catch(f){n(f)}}function c(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,i)}c((t=t.apply(f,e||[])).next())}))};const k=c.a.version,w=c.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"},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(i.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]||c.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.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 c})),d.d(e,"d",(function(){return r})),d.d(e,"a",(function(){return o}));let n,a,i=!1;function c(f){n?i?f():n.push(f):(n=[f],requestAnimationFrame(()=>{i=!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 c})),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(42);d.d(e,"h",(function(){return n.a}));const a=["January","February","March","April","May","June","July","August","September","October","November","December"],i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],c=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())/c+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(),i=f.getDate();f.setFullYear(n,a,i),f.setHours(0,0,0);const c=f.getTime();f.setFullYear(n,a,i+1),f.setHours(0,0,0);const r=f.getTime()-1;return void e.push({title:T(c),minDate:c,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=D(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=D(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 i=parseInt(t);i>=10&&i<=99&&(i+=2e3);const c=(new Date).getFullYear();if(_(n-1,a)&&i>=2013&&i<=c){const f=new Date;f.setFullYear(i,a,n),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(i,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 i=new Date;i.setFullYear(a,d,e+1),i.setHours(0,0,0);const c=i.getTime();if(c>n)continue;i.setFullYear(a,d,e+2),i.setHours(0,0,0);const r=i.getTime()-1;a===s?f.push({title:A(c),minDate:c,maxDate:r}):f.push({title:C(c),minDate:c,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 i[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 i}));var t=d(16);const s=["b","б"],n={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function i(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 i=a[d],c="icons"===d?[500]:[400,500];for(const f of c){const d=(t||[void 0]).map(e=>{var d,t,s,a;const c=[f,"1rem",i].join(" ");return null!==(t=(s=null!==(d=n[c])&&void 0!==d?d:n[c]={})[a=e||""])&&void 0!==t?t:s[a]=document.fonts.load(c,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 i}));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 i(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 c}));var t=d(5),s=d(1),n=d(9),a=d(36),i=d(6);class c{constructor(){this.disabled=n.a.test||-1===t.a.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return i.a.get("tgme_sync").then(e=>{const d=Object(a.h)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;i.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 c;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 i in f)typeof e[i]!=typeof f[i]?(e[i]=Object(t.a)(f[i]),d&&d(a||i)):Object(s.a)(f[i])&&n(f[i],e[i],d,a||i)}},function(f,e,d){"use strict";var t=d(1),s=d(21),n=d(4),a=d(0),i=d(6),c=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"),i.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};i.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:c.e?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:c.e?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=i.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 i=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=i;e.a=i},function(f,e,d){},function(f,e,d){},function(f,e,d){"use strict";d.r(e);var t=d(5),s=d(37),n=d(32),a=d(30),i=d(41),c=d(23),r=d(2),o=(d(53),d(54),d(16));var u=d(0),l=d(14),b=d(34),h=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 g=d(51);Uint8Array.prototype.concat=function(...f){return Object(g.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 m=function(f,e,d,t){return new(d||(d=Promise))((function(s,n){function a(f){try{c(t.next(f))}catch(f){n(f)}}function i(f){try{c(t.throw(f))}catch(f){n(f)}}function c(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,i)}c((t=t.apply(f,e||[])).next())}))};document.addEventListener("DOMContentLoaded",()=>m(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,g=!1;const m=()=>{const d=.01*(g&&!u.a.isOverlayActive?f.height||f.innerHeight:window.innerHeight);e!==d&&(l.b&&e1&&Object(s.a)(),e=d,document.documentElement.style.setProperty("--vh",d+"px"))};if(function(){const f=new Proxy(Worker,{construct:(f,e)=>new f(e[0]+location.search)});Worker=f}(),window.addEventListener("resize",m),m(),a.a){const e=()=>{g=1===d&&a.a&&!u.a.isOverlayActive,m(),f!==window&&(g?(window.removeEventListener("resize",m),f.addEventListener("resize",m)):(f.removeEventListener("resize",m),window.addEventListener("resize",m)))};let d;u.a.addEventListener("im_tab_change",f=>{const t=void 0!==d;d=f,(t||1===d)&&e()}),u.a.addEventListener("overlay_toggle",()=>{e()})}r.d&&!c.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}),r.d&&document.documentElement.classList.add("is-firefox"),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"),l.b?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");let p=performance.now();const v=h.c.getCacheLangPack(),[y,k]=yield Promise.all([b.c.getState(),v]);function w(f,e){f.style.opacity="0",e.then(()=>{window.requestAnimationFrame(()=>{f.style.opacity=""})})}h.c.setTimeFormat(y.settings.timeFormat),u.a.setThemeListener(),k.appVersion!==t.a.langPackVersion&&h.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"),l.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,47)),Promise.resolve().then(d.bind(null,50))]).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,163))).default.mount();break;case"authStateSignQr":t=(yield Promise.all([d.e(0),d.e(1),d.e(17)]).then(d.bind(null,160))).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,165))).default.mount(E.sentCode);break;case"authStatePassword":t=(yield Promise.all([d.e(0),d.e(1),d.e(12)]).then(d.bind(null,139))).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,152))).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(i.a)()),(yield Promise.all([d.e(0),d.e(23)]).then(d.bind(null,107))).default.mount()})))}]); -//# sourceMappingURL=main.5be7f9ad8fda8c3f79cf.bundle.js.map \ No newline at end of file +!function(f){function e(e){for(var d,s,n=e[0],a=e[1],i=0,c=[];i{}},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 i=new a;n.a.rootScope=i,e.a=i},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 i})),d.d(e,"g",(function(){return c})),d.d(e,"d",(function(){return r})),d.d(e,"f",(function(){return o})),d.d(e,"e",(function(){return u}));var t=d(29);const s=navigator?navigator.userAgent:null,n=-1!==navigator.userAgent.search(/OS X|iPhone|iPad|iOS/i),a=-1!==navigator.userAgent.toLowerCase().indexOf("android"),i=(/Chrome/.test(navigator.userAgent)&&/Google Inc/.test(navigator.vendor),(/iPad|iPhone|iPod/.test(navigator.platform)||"MacIntel"===navigator.platform&&navigator.maxTouchPoints>1)&&!t.a.MSStream),c=!!("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=c&&i,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 i=[t.None,t.Error,t.Warn,t.Log,t.Debug],c=Date.now();function r(){return"["+((Date.now()-c)/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 c;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){c=e,f="["+e+"]"},u.setPrefix(f),u.setLevel=function(f){e=i.slice(0,f+1).reduce((f,e)=>f|e,0)},u.bindPrefix=function(f){return p(`${c}] [${f}`,e,d,o)},u}},function(f,e,d){"use strict";const t={id:1025907,hash:"452b0359b988148995f22ff0f4229750",version:"1.4.2",versionFull:"1.4.2 (161)",build:161,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 i{constructor(){this.taskId=0,this.tasks={},i.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)}}i.STORAGES=[];const c=new i;t.a.appStorage=c;e.a=c},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),i=d(0),c=d(27),r=d(2),o=d(40),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(){const e=a.a.langPackCode;return f.lastRequestedLangCode=e,Promise.all([d.e(7).then(d.bind(null,192)),d.e(8).then(d.bind(null,193)),d.e(21).then(d.bind(null,194))]).then(([f,d,t])=>{const s=[];h(f.default,s),h(d.default,s);return m({_:"langPackDifference",from_version:0,lang_code:e,strings:s,version:0,local:!0,countries:t.default})})}function b(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,192)),d.e(8).then(d.bind(null,193)),s.a.invokeApiCacheable("help.getCountriesList",{lang_code:e,hash:0}),f.polyfillPromise])}function h(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 g(e){return f.lastRequestedLangCode=e,b(e).then(([f,e,d,t,s,n])=>{let a=[];[d,t].forEach(f=>{h(f.default,a)}),a=a.concat(f.strings);for(const f of e.strings)a.push(f);return f.strings=a,f.countries=s,m(f)})}function m(f){return f.appVersion=a.a.langPackVersion,n.a.set({langPack:f}).then(()=>(p(f),f))}function p(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&&(i.a.dispatchEvent("language_change",d.lang_code),f.lastAppliedLangCode=d.lang_code,E.clear());Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d&&d.update()})}function v(f,e,d={i:0}){let t=[];let s=0;return f.replace(/(\*\*|__)(.+?)\1|(\n)|(\[.+?\]\(.*?\))|un\d|%\d\$.|%./g,(f,n,a,i,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(...v(a,e,d)),t.push(f)}else if(i)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&&c.b.matchUrlProtocol(n)){a=document.createElement("a");const f=c.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(...v(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 y(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 i=v(a,s);return t?i.map(f=>f instanceof Node?f.textContent:f).join(""):i}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),p(e),e):l()).finally(()=>{r=void 0}))},f.setTimeFormat=function(e){const d=!!f.timeFormat&&f.timeFormat!==e;if(f.timeFormat=e,d){E.clear();Array.from(document.querySelectorAll(".i18n")).forEach(e=>{const d=f.weakMap.get(e);d instanceof S&&d.update()})}},f.loadLocalLangPack=l,f.loadLangPack=b,f.getStrings=function(f,e){return s.a.invokeApi("langpack.getStrings",{lang_pack:a.a.langPack,lang_code:f,keys:e})},f.formatLocalStrings=h,f.getLangPack=g,f.saveLangPack=m,f.polyfillPromise="undefined"!=typeof Intl&&void 0!==Intl.PluralRules?Promise.resolve():d.e(22).then(d.bind(null,195)).then(f=>{window.Intl=Object.assign("undefined"!=typeof Intl?Intl:{},f.default)}),f.applyLangPack=p,f.superFormatter=v,f.format=y,f.weakMap=new WeakMap;class k{constructor(e){this.property="innerHTML",this.element=(null==e?void 0:e.element)||document.createElement("span"),this.element.classList.add("i18n"),e&&(e.key||e.date)&&this.update(e),f.weakMap.set(this.element,this)}}class w extends k{update(f){if(Object(u.a)(this,f),"innerHTML"===this.property)this.element.textContent="",this.element.append(...y(this.key,!1,this.args));else{const f=this.element[this.property],e=y(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=w;const E=new Map;class S extends k{update(e){Object(u.a)(this,e);const d=function(e={}){let d=JSON.stringify(e),t=E.get(d);return t||E.set(d,t=new Intl.DateTimeFormat(f.lastRequestedLangCode+"-u-hc-"+f.timeFormat,e)),t}(this.options);var t;this.element[this.property]=(t=d.format(this.date)).charAt(0).toUpperCase()+t.slice(1)}}f.IntlDateElement=S,f.i18n=function(f,e){return new w({key:f,args:e}).element},f.i18n_=function(f){return new w(f).element},f._i18n=function(f,e,d,t){return new w({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.ce5cd25d42b20b126773.bundle.worker.js")}var s=d(4),n=d(0),a=d(52),i=d(1),c=d(9),r=d(15);class o extends r.a{constructor(f,e,d){super(),this.dcId=f,this.url=e,this.debug=c.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(49),l=d(6),b=d(50),h=d(12),g=d(24),m=d(47),p=d(16),v=d(45),y=d(43),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=i.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 i;return this.hashes[n]&&(i=this.hashes[n][a],i&&(t.hash=i.hash)),this.invokeApiSingleProcess({method:n,processResult:e=>{if(e._.includes("NotModified"))return this.debug&&this.log.warn("NotModified saved!",n,a),i.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:i,options:c}=f,r=this.apiPromisesSingleProcess,o=c.cacheKey||JSON.stringify(i),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,i,c).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 i;d.override&&(a&&a.timeout&&(clearTimeout(a.timeout),delete a.timeout),delete d.override),d.cacheSeconds&&(i=window.setTimeout(()=>{delete s[n]},1e3*d.cacheSeconds),delete d.cacheSeconds);const c=this.invokeApi(f,e,d);return s[n]={timestamp:Date.now(),fulfilled:!1,timeout:i,promise:c,params:e},c}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}};i.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(39);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(46),i=d(18),c=d(4);class r{constructor(f,e){this.storageIsAvailable=!0,Object(i.a)(this,f),n.a.test&&(this.name+="_test"),this.storeName=e,this.log=Object(c.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,i)=>{const c=n.transaction([t],f);c.onerror=f=>{clearTimeout(r),i(c.error)},c.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",c)},1e4),o=e(c.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{c(t.next(f))}catch(f){n(f)}}function i(f){try{c(t.throw(f))}catch(f){n(f)}}function c(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,i)}c((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)})})},i=(...f)=>{self.postMessage(...f)},c=()=>{},r=t?a.bind(null,!1):s?i:c;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(38);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,"d",(function(){return s})),d.d(e,"e",(function(){return n})),d.d(e,"b",(function(){return a})),d.d(e,"a",(function(){return i}));const t=0,s=1271266957,n=777e3,a=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";const t=new class{reload(){try{location.reload()}catch(f){}}close(){try{window.close()}catch(f){}}focus(){window.focus()}};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"&#"+(1024*(f.charCodeAt(0)-55296)+(f.charCodeAt(1)-56320)+65536)+";").replace(/([^\#-~| |!])/g,f=>"&#"+f.charCodeAt(0)+";").replace(//g,">")}var r=d(26);var o=["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"];const u="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",l="["+u+"0-9]",b="((?:https?|ftp)://|mailto:)?(?:"+l+"{1,64}(?::"+l+"{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}|"+l+"["+u+"·0-9-]{0,64}(?:\\."+l+"["+u+"·0-9-]{0,64}){0,10}(?:\\.(xn--[0-9a-z]{2,16}|["+u+"]{2,24})))(?::\\d{2,5})?(?:/(?:\\S{0,255}[^\\s.;,(\\[\\]{}<>\"'])?)?",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=P(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),i=[];let c,r=0;for(;c=f.match(p);){const e=r+c.index;i.push(f.substr(0,c.index));const d=c[3]||c[8]||c[11]||c[13];let t;if(r-=d.length,r+=d.length,s=!1,d.match(/^`*$/))i.push(c[0]);else if(c[3])t={_:"messageEntityPre",language:"",offset:e+c[1].length,length:d.length},a(t)&&("\n"===c[5]&&(c[5]="",r-=1),i.push(c[1]+d+c[5]),r-=c[2].length+c[4].length);else if(c[7]){const f=""===c[6];t={_:y[c[7]],offset:e+(f?0:c[6].length),length:d.length},a(t)&&(f?i.push(d):i.push(c[6]+d+c[9]),r-=2*c[7].length+(f?2:0))}else c[11]?(t={_:"messageEntityMentionName",user_id:c[10].toUserId(),offset:e,length:d.length},a(t)&&(i.push(d),r-=c[0].length-d.length)):c[12]&&(t={_:"messageEntityTextUrl",url:c[14],offset:e,length:d.length},a(t)&&(i.push(d),r-=c[12].length-d.length));s||i.push(c[0]),f=f.substr(c.index+c[0].length),r+=c.index+c[0].length}i.push(f);let o=i.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,e={}){if(!f)return"";const t=[],n=e.entities||d(f),o=e.passEntities||{},u=e.contextSite||"Telegram",l="Telegram"!==u,b=(f,e,d)=>{const s=f.offset,n=d?f.offset+f.length:void 0;let a,i;for(let f=t.length-1;f>=0;--f){const e=t[f].offset;if(void 0===a&&s>=e&&(a=f+1),void 0!==n&&n<=e&&(i=f),s>e&&(void 0===n||n=g){if("messageEntityCaret"!==t._)continue}else t.offset+t.length>g&&(t=Object(i.a)(t),t.length=t.offset+t.length-g);switch(t._){case"messageEntityBold":e.noTextFormat||(e.wrappingDraft?b(t,'',""):b(t,"",""));break;case"messageEntityItalic":e.noTextFormat||(e.wrappingDraft?b(t,'',""):b(t,"",""));break;case"messageEntityStrike":if(e.wrappingDraft){b(t,``,"")}else e.noTextFormat||b(t,"","");break;case"messageEntityUnderline":if(e.wrappingDraft){b(t,``,"")}else e.noTextFormat||b(t,"","");break;case"messageEntityCode":e.wrappingDraft?b(t,'',""):e.noTextFormat||b(t,"","");break;case"messageEntityPre":e.wrappingDraft?b(t,'',""):e.noTextFormat||b(t,`
`,"
");break;case"messageEntityHighlight":b(t,'',"");break;case"messageEntityBotCommand":if(!e.noLinks&&o[t._]){let d,s,n=f.substr(t.offset,t.length).substr(1);-1!==(s=n.indexOf("@"))?(d=n.substr(s+1),n=n.substr(0,s)):d=e.fromBot,b(t,``,"")}break;case"messageEntityEmoji":{let f=a.a;if(f)for(const e in r.a)if(e){if(r.a[e].hasOwnProperty(t.unicode)){f=!1;break}}f?e.wrappingDraft||b(t,'',""):b(t,``,'');break}case"messageEntityCaret":{const f='';h.push({part:f,offset:t.offset});break}case"messageEntityUrl":case"messageEntityTextUrl":if(!e.noLinks||o[t._]){const s=f.substr(t.offset,t.length);let a,i=t.url||s,r=!1;const o=T(i,!0);if(i=o.url,a=o.onclick,"messageEntityTextUrl"===t._){const f=n[d+1];"messageEntityUrl"===(null==f?void 0:f._)&&f.length===t.length&&f.offset===t.offset&&d++,i!==s&&(r=!0)}const u=!!a;a||!r||u||(a="showMaskedAlert"),e.wrappingDraft&&(a=void 0);b(t,``,"")}break;case"messageEntityEmail":if(!e.noLinks){b(t,``,"")}break;case"messageEntityHashtag":{const d=!e.noLinks&&v[u];if(d){const e=f.substr(t.offset,t.length).substr(1);b(t,``,"")}break}case"messageEntityMentionName":e.noLinks&&!o[t._]||b(t,`");break;case"messageEntityMention":if(!e.noLinks){const e=f.substr(t.offset,t.length).substr(1),{url:d,onclick:s}=T("t.me/"+e);b(t,``,"")}break;case"messageEntitySpoiler":if(e.noTextFormat){const e=f.slice(0,t.offset),d=f.slice(t.offset,t.offset+t.length),s=f.slice(t.offset+t.length);f=e+A(d)+s}else e.wrappingDraft?b(t,'',""):b(t,'',"")}}let m=t.length,p=h.length;for(let f=0;f=e.offset););t.splice(d,0,e)}m+=p;const y=[];let k=0;for(let d=0;dk){const d=f.slice(k,n);y.push(e.noEncoding?d:c(d)),k=n}y.push(s)}if(kd&&")"===f.charAt(e-1);)f=f.substr(0,e-1),t--,e--;return d>t&&(f=f.replace(/\)+$/,"")),f}function A(f){const e="⠁⠂⠄⠈⠐⠠⡀⢀⠃⠅⠆⠉⠊⠌⠑⠒⠔⠘⠡⠢⠤⠨⠰⡁⡂⡄⡈⡐⡠⢁⢂⢄⢈⢐⢠⣀⠇⠋⠍⠎⠓⠕⠖⠙⠚⠜⠣⠥⠦⠩⠪⠬⠱⠲⠴⠸⡃⡅⡆⡉⡊⡌⡑⡒⡔⡘⡡⡢⡤⡨⡰⢃⢅⢆⢉⢊⢌⢑⢒⢔⢘⢡⢢⢤⢨⢰⣁⣂⣄⣈⣐⣠⠏⠗⠛⠝⠞⠧⠫⠭⠮⠳⠵⠶⠹⠺⠼⡇⡋⡍⡎⡓⡕⡖⡙⡚⡜⡣⡥⡦⡩⡪⡬⡱⡲⡴⡸⢇⢋⢍⢎⢓⢕⢖⢙⢚⢜⢣⢥⢦⢩⢪⢬⢱⢲⢴⢸⣃⣅⣆⣉⣊⣌⣑⣒⣔⣘⣡⣢⣤⣨⣰⠟⠯⠷⠻⠽⠾⡏⡗⡛⡝⡞⡧⡫⡭⡮⡳⡵⡶⡹⡺⡼⢏⢗⢛⢝⢞⢧⢫⢭⢮⢳⢵⢶⢹⢺⢼⣇⣋⣍⣎⣓⣕⣖⣙⣚⣜⣣⣥⣦⣩⣪⣬⣱⣲⣴⣸⠿⡟⡯⡷⡻⡽⡾⢟⢯⢷⢻⢽⢾⣏⣗⣛⣝⣞⣧⣫⣭⣮⣳⣵⣶⣹⣺⣼⡿⢿⣟⣯⣷⣻⣽⣾⣿",d=e.length,t=[];for(let s=0;s"messageEntityEmoji"===f._),wrappingDraft:e})}function T(e,d){let t,s,n,a;if(_(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 _(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=S,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?S(f,{entities:e.entities,noLinks:!0,wrappingDraft:!0,passEntities:{messageEntityTextUrl:!0,messageEntityMentionName:!0}}):""},f.checkBrackets=P,f.spoiler=A,f.wrapPlainText=function(f,e=[]){return(null==e?void 0:e.length)&&(e=e.filter(f=>"messageEntitySpoiler"===f._)),S(f,{entities:e,noEncoding:!0,noTextFormat:!0,noLinebreaks:!0,noLinks:!0})},f.wrapEmojiText=C,f.wrapUrl=T,f.matchUrlProtocol=_,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?C(t):C(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 S(f,{entities:[D(f)]})}}(w||(w={})),n.a.RichTextProcessor=w;e.b=w},function(f,e,d){"use strict";function t(f){return i(a(f)).join("-")}d.d(e,"b",(function(){return t})),d.d(e,"e",(function(){return i})),d.d(e,"d",(function(){return c})),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 i(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 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)),"")}},function(f,e,d){"use strict";const t="undefined"!=typeof window?window:self;e.a=t},function(f,e,d){"use strict";d.d(e,"a",(function(){return i})),d.d(e,"b",(function(){return c}));var t=d(14),s=d(2),n=d(33),a=d(31);const i=s.g&&s.e&&t.a;if(i){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,i=s.scrollTop,c=s.scrollHeight,r=s.clientHeight,o=i?Math.round(i+s.clientHeight+a):i+a;(c===r||o>=c||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 c(f){i&&f.classList.add("is-sticky-input-bugged")}},function(f,e,d){"use strict";d.d(e,"a",(function(){return s}));var t=d(35);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){if(f=f||window.event){f=f.originalEvent||f;try{f.stopPropagation&&f.stopPropagation(),f.preventDefault&&f.preventDefault(),f.returnValue=!1,f.cancelBubble=!0}catch(f){}}return!1}d.d(e,"a",(function(){return t}))},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),i=d(4),c=d(5),r=d(1),o=d(12),u=d(2),l=d(17),b=d(6),h=d(21),g=d(25);var m=d(3),p=d(44);var v=d(48),y=function(f,e,d,t){return new(d||(d=Promise))((function(s,n){function a(f){try{c(t.next(f))}catch(f){n(f)}}function i(f){try{c(t.throw(f))}catch(f){n(f)}}function c(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,i)}c((t=t.apply(f,e||[])).next())}))};const k=c.a.version,w=c.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(i.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]||c.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.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 c})),d.d(e,"d",(function(){return r})),d.d(e,"a",(function(){return o}));let n,a,i=!1;function c(f){n?i?f():n.push(f):(n=[f],requestAnimationFrame(()=>{i=!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 c})),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(42);d.d(e,"h",(function(){return n.a}));const a=["January","February","March","April","May","June","July","August","September","October","November","December"],i=["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],c=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())/c+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(),i=f.getDate();f.setFullYear(n,a,i),f.setHours(0,0,0);const c=f.getTime();f.setFullYear(n,a,i+1),f.setHours(0,0,0);const r=f.getTime()-1;return void e.push({title:T(c),minDate:c,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=D(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=D(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 i=parseInt(t);i>=10&&i<=99&&(i+=2e3);const c=(new Date).getFullYear();if(_(n-1,a)&&i>=2013&&i<=c){const f=new Date;f.setFullYear(i,a,n),f.setHours(0,0,0);const d=f.getTime();f.setFullYear(i,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 i=new Date;i.setFullYear(a,d,e+1),i.setHours(0,0,0);const c=i.getTime();if(c>n)continue;i.setFullYear(a,d,e+2),i.setHours(0,0,0);const r=i.getTime()-1;a===s?f.push({title:A(c),minDate:c,maxDate:r}):f.push({title:C(c),minDate:c,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 i[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 i}));var t=d(16);const s=["b","б"],n={},a={text:"Roboto",icons:"tgico",monospace:"Roboto Mono"};function i(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 i=a[d],c="icons"===d?[500]:[400,500];for(const f of c){const d=(t||[void 0]).map(e=>{var d,t,s,a;const c=[f,"1rem",i].join(" ");return null!==(t=(s=null!==(d=n[c])&&void 0!==d?d:n[c]={})[a=e||""])&&void 0!==t?t:s[a]=document.fonts.load(c,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 i}));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 i(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 c}));var t=d(5),s=d(1),n=d(9),a=d(36),i=d(6);class c{constructor(){this.disabled=n.a.test||-1===t.a.domains.indexOf(location.hostname)}setAuthorized(f){if(!this.disabled)return i.a.get("tgme_sync").then(e=>{const d=Object(a.h)(!0);if(f&&e&&e.canRedirect===f&&e.ts+86400>d)return;i.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 c;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 i in f)typeof e[i]!=typeof f[i]?(e[i]=Object(t.a)(f[i]),d&&d(a||i)):Object(s.a)(f[i])&&n(f[i],e[i],d,a||i)}},function(f,e,d){"use strict";var t=d(1),s=d(21),n=d(4),a=d(0),i=d(6),c=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"),i.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};i.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:c.e?"PushNotification.Action.Mute1d.Mobile":"PushNotification.Action.Mute1d",push_action_settings:c.e?"PushNotification.Action.Settings.Mobile":"PushNotification.Action.Settings",push_message_nopreview:"PushNotification.Message.NoPreview"};for(const d in e)f[d]=i.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 i=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=i;e.a=i},function(f,e,d){},function(f,e,d){},function(f,e,d){"use strict";d.r(e);var t=d(5),s=d(37),n=d(32),a=d(30),i=d(41),c=d(23),r=d(2),o=(d(53),d(54),d(16));var u=d(0),l=d(14),b=d(34),h=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 g=d(51);Uint8Array.prototype.concat=function(...f){return Object(g.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 m=function(f,e,d,t){return new(d||(d=Promise))((function(s,n){function a(f){try{c(t.next(f))}catch(f){n(f)}}function i(f){try{c(t.throw(f))}catch(f){n(f)}}function c(f){var e;f.done?s(f.value):(e=f.value,e instanceof d?e:new d((function(f){f(e)}))).then(a,i)}c((t=t.apply(f,e||[])).next())}))};document.addEventListener("DOMContentLoaded",()=>m(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,g=!1;const m=()=>{const d=.01*(g&&!u.a.isOverlayActive?f.height||f.innerHeight:window.innerHeight);e!==d&&(l.b&&e1&&Object(s.a)(),e=d,document.documentElement.style.setProperty("--vh",d+"px"))};if(function(){const f=new Proxy(Worker,{construct:(f,e)=>new f(e[0]+location.search)});Worker=f}(),window.addEventListener("resize",m),m(),a.a){const e=()=>{g=1===d&&a.a&&!u.a.isOverlayActive,m(),f!==window&&(g?(window.removeEventListener("resize",m),f.addEventListener("resize",m)):(f.removeEventListener("resize",m),window.addEventListener("resize",m)))};let d;u.a.addEventListener("im_tab_change",f=>{const t=void 0!==d;d=f,(t||1===d)&&e()}),u.a.addEventListener("overlay_toggle",()=>{e()})}r.d&&!c.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}),r.d&&document.documentElement.classList.add("is-firefox"),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"),l.b?document.documentElement.classList.add("is-touch"):document.documentElement.classList.add("no-touch");let p=performance.now();const v=h.c.getCacheLangPack(),[y,k]=yield Promise.all([b.c.getState(),v]);function w(f,e){f.style.opacity="0",e.then(()=>{window.requestAnimationFrame(()=>{f.style.opacity=""})})}h.c.setTimeFormat(y.settings.timeFormat),u.a.setThemeListener(),k.appVersion!==t.a.langPackVersion&&h.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"),l.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,47)),Promise.resolve().then(d.bind(null,50))]).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,164))).default.mount();break;case"authStateSignQr":t=(yield Promise.all([d.e(0),d.e(1),d.e(17)]).then(d.bind(null,161))).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,166))).default.mount(E.sentCode);break;case"authStatePassword":t=(yield Promise.all([d.e(0),d.e(1),d.e(12)]).then(d.bind(null,139))).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,152))).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(i.a)()),(yield Promise.all([d.e(0),d.e(23)]).then(d.bind(null,107))).default.mount()})))}]); +//# sourceMappingURL=main.df631e4b57ec50c6de09.bundle.js.map \ No newline at end of file diff --git a/public/main.df631e4b57ec50c6de09.bundle.js.map b/public/main.df631e4b57ec50c6de09.bundle.js.map new file mode 100644 index 00000000..de4f9c70 --- /dev/null +++ b/public/main.df631e4b57ec50c6de09.bundle.js.map @@ -0,0 +1 @@ +{"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/lib/appManagers/appRuntimeManager.ts","webpack:///./src/helpers/compareVersion.ts","webpack:///./src/config/emoji.ts","webpack:///./src/vendor/emoji/regex.ts","webpack:///./src/helpers/string/encodeEntities.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/dom/fixSafariStickyInputFocusing.ts","webpack:///./src/helpers/dom/fixSafariStickyInput.ts","webpack:///./src/helpers/dom/cancelEvent.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/peerIdPolyfill.ts","webpack:///./src/lib/polyfill.ts","webpack:///./src/index.ts","webpack:///./src/helpers/dom/toggleAttributePolyfill.ts","webpack:///./src/helpers/setWorkerProxy.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","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","format","plain","str","select","item","Node","join","Map","getCacheLangPack","finally","setTimeFormat","haveToUpdate","timeFormat","IntlDateElement","getStrings","invokeApi","_Intl","assign","WeakMap","IntlElementBase","options","add","date","IntlElement","safeAssign","formatted","dataset","deepEqual","dateTimeFormat","json","DateTimeFormat","getDateTimeFormat","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","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","focus","compareVersion","v1","v2","s1","s2","EmojiVersions","Emoji","encodeEntities","charCodeAt","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","wrapRichText","lol","passEntities","contextSite","contextExternal","insertPart","startPart","endPart","startOffset","endOffset","startIndex","endIndex","part","pushPartsAfterSort","textLength","noTextFormat","wrappingDraft","noLinks","bot","atPos","command","fromBot","encodeURIComponent","isSupported","html","entityText","masked","wrapped","currentContext","electronHelpers","contextUrl","hashtag","username","before","spoilerBefore","after","spoiler","partsLength","pushPartsAfterSortLength","insertAt","usedLength","sliced","noEncoding","urlLength","urlOpenBrackets","urlCloseBrackets","chars","charsLength","char","wrapEmojiText","isDraft","tgMeMatch","telescoPeMatch","tgMatch","fullPath","path","getEmojiEntityFromEmoji","emoji","fixEmoji","end","wrapDraftText","messageEntityTextUrl","messageEntityMentionName","wrapPlainText","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","preventDefault","lastFocusOutTimeStamp","timeStamp","touchStart","activeElement","blur","fixSafariStickyInputFocusing","fixSafariStickyInput","transform","cancelEvent","originalEvent","stopPropagation","returnValue","cancelBubble","findUpClassName","className","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","hour","minute","year","day","month","weekday","formatFullSentTimeRaw","timeEl","formatTime","dateEl","capitalize","textTransform","formatFullSentTime","fragment","createDocumentFragment","getFullDate","monthAsNumber","getHours","getMinutes","noSeconds","getSeconds","leadingZero","noTime","yearPattern","monthYearOrDayPattern","yearOrDayAndMonthPattern","shortDate","longDate","numberOfDaysEachMonth","fillTipDates","query","dates","setFullYear","setHours","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","toChatId","isChat","isPeerId","Number","abs","onFinally","Element","toggleAttribute","force","hasAttribute","removeAttribute","w","visualViewport","lastVH","setViewportVH","setVH","vh","height","innerHeight","setProperty","workerProxy","Proxy","construct","setWorkerProxy","toggleResizeMode","tabId","wasTabId","tagName","langPromise","getState","fadeInWhenFontsReady","elem","opacity","setThemeListener","getElementById","pagePromise","placeholder","prepend","cloneNode","meModule","pushModule","mount","sentCode","authCode"],"mappings":"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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,E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","file":"main.df631e4b57ec50c6de09.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\":\"50ca39d9514acbfe6a6a\",\"1\":\"f63fd3ceb28384c193a9\",\"2\":\"9ab0343c05ba5c67500b\",\"3\":\"f43eeadba6063db40ad3\",\"4\":\"3e09949378470770bf73\",\"5\":\"73d599f377c00cd66014\",\"6\":\"fcc4f6420b303e25e8ce\",\"7\":\"0df5f895e8235966714f\",\"8\":\"02a6c8937bbd384c2467\",\"10\":\"80cef69985dcb7541efc\",\"11\":\"9d6292221b761a8e5ba9\",\"12\":\"49af8796ae03f597ea67\",\"13\":\"a1a0e4713c63e85c7faf\",\"14\":\"0c3a1ae74a0c65edf059\",\"15\":\"59dc38a60e45ddb6327a\",\"16\":\"049af2cb2d7656888f47\",\"17\":\"d520b3312c59a122ae5d\",\"18\":\"db688e1ac83bd1339811\",\"19\":\"963fd24da8d461207246\",\"20\":\"56a736e3dc441023f4f8\",\"21\":\"f29643148b4ebe90e4ca\",\"22\":\"c0ac3c204b1397aea626\",\"23\":\"81a67a70b9b28e4f121f\",\"24\":\"42ebbd3ee500042019ef\"}[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 = 55);\n","/*\n * 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 export function setTimeFormat(format: State['settings']['timeFormat']) {\n const haveToUpdate = !!timeFormat && timeFormat !== format;\n timeFormat = format;\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\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',\n\t};\n\n\tabstract class IntlElementBase {\n\t\tpublic element: IntlElementBaseOptions['element'];\n\t\tpublic property: IntlElementBaseOptions['property'] = 'innerHTML';\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 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\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\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\t\tpublic update(options?: IntlDateElementOptions) {\n\t\t\tsafeAssign(this, options);\n\t\n\t\t\t//var options = { month: 'long', day: 'numeric' };\n\t\t\t\n\t\t\t// * https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/Locale/hourCycle#adding_an_hour_cycle_via_the_locale_string\n\t\t\tconst dateTimeFormat = getDateTimeFormat(this.options);\n\t\t\t\n\t\t\t(this.element as any)[this.property] = capitalizeFirstLetter(dateTimeFormat.format(this.date));\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.ce5cd25d42b20b126773.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 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","/*\r\n * https://github.com/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","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","/*\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","// 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","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 * 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 { 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 /**\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 }> = {}) {\n if(!text) {\n return '';\n }\n\n const lol: {\n part: string,\n offset: number,\n // priority: number\n }[] = [];\n const entities = options.entities || parseEntities(text);\n\n const passEntities: typeof options.passEntities = options.passEntities || {};\n const contextSite = options.contextSite || 'Telegram';\n const contextExternal = contextSite !== 'Telegram';\n\n const insertPart = (entity: MessageEntity, startPart: string, endPart?: string/* , priority = 0 */) => {\n const startOffset = entity.offset, endOffset = endPart ? entity.offset + entity.length : undefined;\n let startIndex: number, endIndex: number, length = lol.length;\n for(let i = length - 1; i >= 0; --i) {\n const offset = lol[i].offset;\n\n if(startIndex === undefined && startOffset >= offset) {\n startIndex = i + 1;\n }\n\n if(endOffset !== undefined) {\n if(endOffset <= offset) {\n endIndex = i;\n }\n }\n\n if(startOffset > offset && (endOffset === undefined || endOffset < offset)) {\n break;\n }\n }\n\n startIndex ??= 0;\n lol.splice(startIndex, 0, {part: startPart, offset: entity.offset/* , priority */});\n\n if(endOffset !== undefined) {\n endIndex ??= startIndex;\n ++endIndex;\n lol.splice(endIndex, 0, {part: endPart, offset: entity.offset + entity.length/* , priority */});\n }\n };\n\n const pushPartsAfterSort: typeof lol = [];\n const textLength = text.length;\n for(let i = 0, length = entities.length; i < length; ++i) {\n let entity = entities[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 switch(entity._) {\n case 'messageEntityBold': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n }\n\n break;\n }\n\n case 'messageEntityItalic': {\n if(!options.noTextFormat) {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\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 insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n\n case 'messageEntityUnderline': {\n if(options.wrappingDraft) {\n const styleName = IS_SAFARI ? 'text-decoration' : 'text-decoration-line';\n insertPart(entity, ``, '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n\n break;\n }\n \n case 'messageEntityCode': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, '', '');\n }\n \n break;\n }\n \n case 'messageEntityPre': {\n if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else if(!options.noTextFormat) {\n insertPart(entity, `
`, '
');\n }\n \n break;\n }\n\n case 'messageEntityHighlight': {\n insertPart(entity, '', '');\n break;\n }\n\n case 'messageEntityBotCommand': {\n // if(!(options.noLinks || options.noCommands || contextExternal)/* && !entity.unsafe */) {\n if(!options.noLinks && passEntities[entity._]) {\n const entityText = text.substr(entity.offset, entity.length);\n let command = entityText.substr(1);\n let bot: string | boolean;\n let atPos: number;\n if((atPos = command.indexOf('@')) !== -1) {\n bot = command.substr(atPos + 1);\n command = command.substr(0, atPos);\n } else {\n bot = options.fromBot;\n }\n\n insertPart(entity, ``, ``);\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 insertPart(entity, `\"`,`);\n // }\n //} else if(options.mustWrapEmoji) {\n } else if(!options.wrappingDraft) {\n insertPart(entity, '', '');\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 const html = '';\n // const html = '';\n // insertPart(entity, '');\n // insertPart(entity, '');\n pushPartsAfterSort.push({part: html, offset: entity.offset});\n // insertPart(entity, html/* , undefined, 1 */);\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 const entityText = text.substr(entity.offset, entity.length);\n\n // let inner: string;\n let url: string = (entity as MessageEntity.messageEntityTextUrl).url || entityText;\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 const nextEntity = entities[i + 1];\n if(nextEntity?._ === 'messageEntityUrl' && \n nextEntity.length === entity.length && \n nextEntity.offset === entity.offset) {\n i++;\n }\n\n if(url !== entityText) {\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 ? encodeEntities(url)\n : `javascript:electronHelpers.openExternal('${encodeEntities(url)}');`;\n\n const target = (currentContext || typeof electronHelpers !== 'undefined')\n ? '' : ' target=\"_blank\" rel=\"noopener noreferrer\"';\n\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityEmail': {\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n \n case 'messageEntityHashtag': {\n const contextUrl = !options.noLinks && siteHashtags[contextSite];\n if(contextUrl) {\n const entityText = text.substr(entity.offset, entity.length);\n const hashtag = entityText.substr(1);\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMentionName': {\n if(!(options.noLinks && !passEntities[entity._])) {\n insertPart(entity, ``, '');\n }\n\n break;\n }\n\n case 'messageEntityMention': {\n // const contextUrl = !options.noLinks && siteMentions[contextSite];\n if(!options.noLinks) {\n const entityText = text.substr(entity.offset, entity.length);\n const username = entityText.substr(1);\n\n const {url, onclick} = wrapUrl('t.me/' + username);\n\n // insertPart(entity, ``, '');\n insertPart(entity, ``, '');\n }\n \n break;\n }\n\n case 'messageEntitySpoiler': {\n if(options.noTextFormat) {\n const before = text.slice(0, entity.offset);\n const spoilerBefore = text.slice(entity.offset, entity.offset + entity.length);\n const after = text.slice(entity.offset + entity.length);\n text = before + spoiler(spoilerBefore)/* '▚'.repeat(entity.length) */ + after;\n } else if(options.wrappingDraft) {\n insertPart(entity, '', '');\n } else {\n insertPart(entity, '', '');\n }\n \n break;\n }\n }\n }\n\n // lol.sort((a, b) => (a.offset - b.offset) || (a.priority - b.priority));\n // lol.sort((a, b) => a.offset - b.offset); // have to sort because of nested entities\n\n let partsLength = lol.length, pushPartsAfterSortLength = pushPartsAfterSort.length;\n for(let i = 0; i < pushPartsAfterSortLength; ++i) {\n const part = pushPartsAfterSort[i];\n let insertAt = 0;\n while(insertAt < partsLength) {\n if(lol[insertAt++].offset >= part.offset) {\n break;\n }\n }\n\n lol.splice(insertAt, 0, part);\n }\n\n partsLength += pushPartsAfterSortLength;\n\n const arr: string[] = [];\n let usedLength = 0;\n for(let i = 0; i < partsLength; ++i) {\n const {part, offset} = lol[i];\n if(offset > usedLength) {\n const sliced = text.slice(usedLength, offset);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n usedLength = offset;\n }\n\n arr.push(part);\n }\n\n if(usedLength < text.length) {\n const sliced = text.slice(usedLength);\n arr.push(options.noEncoding ? sliced : encodeEntities(sliced));\n }\n\n return arr.join('');\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 '';\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 });\n }\n\n export function wrapEmojiText(text: string, isDraft = false) {\n if(!text) return '';\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","/*\n * 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 * 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","/*\n * 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\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 }\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\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 if(IS_FIREFOX) {\n document.documentElement.classList.add('is-firefox');\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","/*\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"],"sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.a82172768f4f413f9db0.bundle.worker.js b/public/mtproto.worker.a82172768f4f413f9db0.bundle.worker.js deleted file mode 100644 index 1bd64e73..00000000 --- a/public/mtproto.worker.a82172768f4f413f9db0.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):z(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 k(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=z(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,k=n[1],I=e.sign;return"number"==typeof d?(S&&(d=-d),d=new o(d)):d=new p(d,S),"number"==typeof k?(I&&(k=-k),k=new o(k)):k=new p(k,I),[d,k]}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=z(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-z(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=z(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):k(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():k(Math.abs(e.value),this.value,this.sign!==e.sign)},o.prototype.multiply=function(e){return z(e)._multiplyBySmall(this)},o.prototype.times=o.prototype.multiply,m.prototype.multiply=function(e){return new m(this.value*z(e).value)},m.prototype.times=m.prototype.multiply,p.prototype.square=function(){return new p(I(this.value),!1)},o.prototype.square=function(){var e=this.value*this.value;return d(e)?new o(e):new p(I(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/z(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%z(e).value)},o.prototype.remainder=o.prototype.mod=p.prototype.remainder=p.prototype.mod,p.prototype.pow=function(e){var t,a,n,s=z(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=z(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=z(e),(t=z(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=z(e),a=this.value,n=t.value;return t.isSmall?1:M(a,n)},o.prototype.compareAbs=function(e){var t=z(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=z(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=z(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=z(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=z(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=z(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 U(e){return Math.abs(e)<=t}function B(e,t,a){t=z(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=z(e).toJSNumber();if(!U(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=z(e).toJSNumber();if(!U(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 B(this,e,(function(e,t){return e&t}))},m.prototype.and=o.prototype.and=p.prototype.and,p.prototype.or=function(e){return B(this,e,(function(e,t){return e|t}))},m.prototype.or=o.prototype.or=p.prototype.or,p.prototype.xor=function(e){return B(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=z(e),t=z(t),e.greater(t)?e:t}function L(e,t){return e=z(e),t=z(t),e.lesser(t)?e:t}function N(e,t){if(e=z(e).abs(),t=z(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=z(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 z(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 H=0;H<1e3;H++)r[H]=z(H),H>0&&(r[-H]=z(-H));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=z(e).abs(),t=z(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=z(e),a=z(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,k,I;const C=e.state;a=e.next_in,k=e.input,n=a+(e.avail_in-5),s=e.next_out,I=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)I[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(y&(1<>>=v,l-=v),l<15&&(y+=k[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;)I[s++]=S[P++],I[s++]=S[P++],I[s++]=S[P++],b-=3;b&&(I[s++]=S[P++],b>1&&(I[s++]=S[P++]))}else{P=s-w;do{I[s++]=I[P++],I[s++]=I[P++],I[s++]=I[P++],b-=3}while(b>2);b&&(I[s++]=I[P++],b>1&&(I[s++]=I[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,k=0,I=0,C=0,A=0,M=0,R=null,E=0;const D=new Uint16Array(16),T=new Uint16Array(16);let V,U,B,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-I,d[b]<_?(U=0,B=d[b]):d[b]>_?(U=x[F+d[b]],B=R[E+d[b]]):(U=96,B=0),l=1<>I)+g]=V<<24|U<<16|B|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===I&&(I=S),f+=w,k=v-I,C=1<852||2===e&&A>592)return 1;u=M&h,s[u]=S<<24|k<<16|f-m|0}}return 0!==M&&(s[f+M]=v-I<<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,k=e=>(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24);function I(){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 I;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},U=(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,I,C,A,M,R,E,D,T,B,x,F,L,N,O,q,G,K,j=0;const z=new Uint8Array(4);let H,W;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,I=e.avail_in,A=i.hold,M=i.bits,R=I,E=C,K=g;e:for(;;)switch(i.mode){case 1:if(0===i.wrap){i.mode=13;break}for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>>8&255,i.check=n(i.check,z,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&&(z[0]=255&A,z[1]=A>>>8&255,i.check=n(i.check,z,2,0)),A=0,M=0,i.mode=3;case 3:for(;M<32;){if(0===I)break e;I--,A+=r[o++]<>>8&255,z[2]=A>>>16&255,z[3]=A>>>24&255,i.check=n(i.check,z,4,0)),A=0,M=0,i.mode=4;case 4:for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>8),512&i.flags&&(z[0]=255&A,z[1]=A>>>8&255,i.check=n(i.check,z,2,0)),A=0,M=0,i.mode=5;case 5:if(1024&i.flags){for(;M<16;){if(0===I)break e;I--,A+=r[o++]<>>8&255,i.check=n(i.check,z,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>I&&(D=I),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)),I-=D,o+=D,i.length-=D),i.length))break e;i.length=0,i.mode=7;case 7:if(2048&i.flags){if(0===I)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===I)break e;I--,A+=r[o++]<>>=7&M,M-=7&M,i.mode=27;break}for(;M<3;){if(0===I)break e;I--,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===I)break e;I--,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>I&&(D=I),D>C&&(D=C),0===D)break e;p.set(r.subarray(o,o+D),d),I-=D,o+=D,C-=D,d+=D,i.length-=D;break}i.mode=P;break;case 17:for(;M<14;){if(0===I)break e;I--,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,H={bits:i.lenbits},K=m(0,i.lens,0,19,i.lencode,0,i.work,H),i.lenbits=H.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===I)break e;I--,A+=r[o++]<>>=x,M-=x,i.lens[i.have++]=L;else{if(16===L){for(W=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(W=x+3;M>>=x,M-=x,G=0,D=3+(7&A),A>>>=3,M-=3}else{for(W=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,H={bits:i.lenbits},K=m(1,i.lens,0,i.nlen,i.lencode,0,i.work,H),i.lenbits=H.bits,K){e.msg="invalid literal/lengths set",i.mode=S;break}if(i.distbits=6,i.distcode=i.distdyn,H={bits:i.distbits},K=m(2,i.lens,i.nlen,i.ndist,i.distcode,0,i.work,H),i.distbits=H.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(I>=6&&C>=258){e.next_out=d,e.avail_out=C,e.next_in=o,e.avail_in=I,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,I=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===I)break e;I--,A+=r[o++]<>N)],x=j>>>24,F=j>>>16&255,L=65535&j,!(N+x<=M);){if(0===I)break e;I--,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(W=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===I)break e;I--,A+=r[o++]<>N)],x=j>>>24,F=j>>>16&255,L=65535&j,!(N+x<=M);){if(0===I)break e;I--,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(W=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),B=i.window}else B=p,T=d-i.offset,D=i.length;D>C&&(D=C),C-=D,i.length-=D;do{p[d++]=B[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===I)break e;I--,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=U(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},H={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"},W=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 W,this.strm.avail_out=0;let a=x(this.strm,t.windowBits);if(a!==X)throw new Error(H[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(H[a])}function ie(e,t){const a=new se(t);if(a.push(e),a.err)throw a.msg||H[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];)B(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=z(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:"kicked",type:"flags.1?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:-1673717362,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?string"}],type:"InputPeerNotifySettings"},{id:-1353671392,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:"sound",type:"flags.3?string"}],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:-818518751,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"}],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:"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:460632885,predicate:"botInfo",params:[{name:"user_id",type:"long"},{name:"description",type:"string"},{name:"commands",type:"Vector"}],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:"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:-516145888,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:"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_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"}],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:-1355375294,method:"channels.deleteHistory",params:[{name:"channel",type:"InputChannel"},{name:"max_id",type:"int"}],type:"Bool"},{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"}]},layer:139};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,U=+w.MTProto.constructors.find(e=>"gzip_packed"===e.predicate).id;class B{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===U){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),k=_.add(S),I=w.modPow(k,i),C=yield Ve.invokeCrypto("sha256",m(L(I),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 H=new Uint8Array(256),W=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(;!H[p];p^=e||1)a=(a=o^o<<1^o<<2^o<<3^o<<4)>>8^255&a^99,H[p]=a,W[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=H[a>>>24]<<24^H[a>>16&255]<<16^H[a>>8&255]<<8^H[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[H[a>>>24]]^Y[H[a>>16&255]]^ee[H[a>>8&255]]^te[H[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]=H[r>>>24]<<24^H[p>>16&255]<<16^H[o>>8&255]<<8^H[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]=W[r>>>24]<<24^W[p>>16&255]<<16^W[o>>8&255]<<8^W[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 ke(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 Ie=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 Ie(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=Ue;var Be=Ue;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 ze=Le||Ne;je=ze?e=>e.split("@")[0]:e=>{const t=e.trim().split(" ");if(3===t.length)return t[1].slice(t[1].lastIndexOf(".")+1)};const He=!ze,We=ze?2:3;function Je(){const e=(new Error).stack.split("\n"),t=e[We]||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),He?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.1",versionFull:"1.4.1 (160)",build:160,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 kt=new St;p&&(p.dcConfigurator=kt);var It=kt,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:It.chooseServer(Ye.baseDcId,"client","https",!1),websocket:It.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 B({mtproto:!0}),a=we();t.storeMethod("ping",{ping_id:a});const n={msg_id:Be.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=Be.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 B({mtproto:!0});n.storeMethod(e,t);const s=Be.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 B({mtproto:!0});a.storeObject(e,"Object");const n=Be.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 B(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===Ut){const e=w.API.methods.find(e=>"invokeAfterMsg"===e.method);Ut=e?+e.id:0}Ut?(n.storeInt(Ut,"invokeAfterMsg"),n.storeLong(a.afterMessageId,"msg_id")):this.log.error("no invokeAfterMsg!")}a.resultType=n.storeMethod(e,t);const s={msg_id:Be.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 B({mtproto:!0});e.storeMethod("http_wait",{max_delay:500,wait_after:150,max_wait:3e3}),a.push({msg_id:Be.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 B({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:Be.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 B({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 B({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),Be.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 Bt(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 B;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 B({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 B({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 B({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");Be.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 B({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 B({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 zt=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 It.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(It.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(It.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=zt;var Ht=zt;var Wt=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)=>Wt(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)=>Ve.invokeCrypto("gzipUncompress",e.slice().buffer,!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(),Ht.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 Ht.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),Ht.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":Ht[t.task].apply(Ht,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=Ht[t.task].apply(Ht,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.a82172768f4f413f9db0.bundle.worker.js.map \ No newline at end of file diff --git a/public/mtproto.worker.a82172768f4f413f9db0.bundle.worker.js.map b/public/mtproto.worker.a82172768f4f413f9db0.bundle.worker.js.map deleted file mode 100644 index 4e579af2..00000000 --- a/public/mtproto.worker.a82172768f4f413f9db0.bundle.worker.js.map +++ /dev/null @@ -1 +0,0 @@ -{"version":3,"sources":["webpack:///mtproto.worker.45ed617f8122f1639d6f.bundle.worker.js"],"names":["modules","installedModules","__webpack_require__","moduleId","exports","module","i","l","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","__WEBPACK_AMD_DEFINE_RESULT__","bigInt","undefined","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","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","-1","-2","-3","-4","-5","-6","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","__webpack_exports__","bufferConcats","args","reduce","acc","byteLength","lastLength","forEach","ArrayBuffer","isWebpSupported","Promise","finally","onFinally","callback","resolve","then","reason","reject","Modes","location","search","debug","http","ssl","multipleConnections","asServiceWorker","transport","modes","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","localStorage_LocalStorage","[object Object]","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","obj","onlyLocal","stringified","setItem","saveLocal","removeItem","keys","delete","enabled","clear","localStorage_LocalStorageController","taskId","tasks","STORAGES","storage","id","payload","proxy","sessionStorage","appStorage","lib_sessionStorage","mtproto_schema","MTProto","constructors","predicate","params","methods","method","API","layer","bytesToHex","bytes","isObject","pako_inflate_min","pako_inflate_min_default","gzipUncompress","BigInteger_default","intToUint","longFromInts","high","boolFalse","find","boolTrue","vector","gzipPacked","tl_utils_TLSerialization","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","methodData","storeInt","pFlags","flagsOffsets","param","condType","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","substr","itemType","schema","isBare","constructorData","charAt","tl_utils_TLDeserialization","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","__awaiter","thisArg","_arguments","generator","fulfilled","step","rejected","computeSRP","password","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","cryptoworker","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","aes_S","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","aes","counter","incrementCounter","bytesFromWordss","bytesToWordss","words","aesSync","keyBytes","ivBytes","aesEncryptSync","aesDecryptSync","crypto_subtle","subtle","pbkdf2_awaiter","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_awaiter","generateDh","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","computeDhKey_awaiter","computeDhKey","key_fingerprint","getEmojisFingerprint_awaiter","readBigIntFromBytesBE","_bits","emojis","getEmojisFingerprint","emojisLength","partOffset","codePoints","performTaskWorker","super","webWorker","awaiting","pending","utils","aes-encrypt","aes-decrypt","rsa-encrypt","factorize","mod-pow","generate-dh","compute-dh-key","get-emojis-fingerprint","task","timeManager","lastMessageId","timeOffset","timeTicks","Date","now","messageId","serverTime","localTime","newTimeOffset","changed","server_time_offset","mtproto_timeManager","environment_ctx","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","app","noop_noop","pause","ms","setTimeout","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","deferred","catch","cancel","assign","findAndSplice","verify","findIndex","eventListenerBase_EventListenerBase","reuseResults","_constructor","listenerResults","_a","_b","once","addEventListener","collectResults","removeEventListener","_dispatchEvent","indexOfAndSplice","item","idx","spliced","websocket_Socket","dcId","url","logSuffix","handleOpen","dispatchEvent","handleError","close","handleClose","removeListeners","handleMessage","event","data","send","body","ws","logTypes","connect","WebSocket","binaryType","_CTR_counter","_CTR_remainingCounter","_CTR_remainingCounterIndex","_CTR_aes","__classPrivateFieldSet","receiver","kind","has","__classPrivateFieldGet","Counter","initialValue","obfuscation_CTR","encrypted","increment","WeakMap","obfuscation_Obfuscation","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","update","ConnectionStatus","intermediate","tag","tcpObfuscated_TcpObfuscated","Connection","retryTimeout","obfuscation","connected","autoReconnect","onOpen","controller","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","socketProxied_SocketProxied","socketsProxied","Map","TEST_SUFFIX","dcConfigurator_DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportHTTP","dcOption","http_HTTP","transportType","reuse","client","download","upload","servers","transports","dcConfigurator","mtproto_dcConfigurator","controller_awaiter","opened","waitForWebSocket","https","chooseServer","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","http_awaiter","fetch","status","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","bytesCmp","networker_awaiter","networker_delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","file","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networker_MTPNetworker","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","initConnection","mtproto_networkerFactory","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","rsaKeysManager_awaiter","rsaKeysManager","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","fill","foundKey","fingerprint","authorizer_awaiter","authorizer","cached","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","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","idb_IDBStorage","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_awaiter","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","_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","mtproto_apiManager","fileManager_awaiter","fileManager","blobSupported","size","saveFileCallback","write","finalize","saveToStorage","getParts","replaceParts","parts","cacheStorage_awaiter","cacheStorage_CacheStorageController","dbName","caches","timeoutOperation","Response","headers","Content-Length","res","fileSize","fakeWriter","getFakeFileWriter","saveFile","deleteAll","readBlobAsArrayBuffer","reader","FileReader","readBlobAs","apiFileManager_awaiter","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","uncompressTGV","convertWebp","convertPromise","hex","activeDelta","downloadPull","downloadCheck","downloadLimit","from","canceled","limit","checkCancel","downloadRequest","getDelta","invoke","refreshReference","reference","file_reference","checkedReference","inputFileLocation","isAvailable","process","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","Set","mtproto_apiFileManager","mtproto_worker_awaiter","webpSupported","setUpdatesProcessor","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","finishTask","online","toggleStorage","originalPayload"],"mappings":"CAAS,SAAUA,GAET,IAAIC,EAAmB,GAGvB,SAASC,EAAoBC,GAG5B,GAAGF,EAAiBE,GACnB,OAAOF,EAAiBE,GAAUC,QAGnC,IAAIC,EAASJ,EAAiBE,GAAY,CACzCG,EAAGH,EACHI,GAAG,EACHH,QAAS,IAUV,OANAJ,EAAQG,GAAUK,KAAKH,EAAOD,QAASC,EAAQA,EAAOD,QAASF,GAG/DG,EAAOE,GAAI,EAGJF,EAAOD,QAKfF,EAAoBO,EAAIT,EAGxBE,EAAoBQ,EAAIT,EAGxBC,EAAoBS,EAAI,SAASP,EAASQ,EAAMC,GAC3CX,EAAoBY,EAAEV,EAASQ,IAClCG,OAAOC,eAAeZ,EAASQ,EAAM,CAAEK,YAAY,EAAMC,IAAKL,KAKhEX,EAAoBiB,EAAI,SAASf,GACX,oBAAXgB,QAA0BA,OAAOC,aAC1CN,OAAOC,eAAeZ,EAASgB,OAAOC,YAAa,CAAEC,MAAO,WAE7DP,OAAOC,eAAeZ,EAAS,aAAc,CAAEkB,OAAO,KAQvDpB,EAAoBqB,EAAI,SAASD,EAAOE,GAEvC,GADU,EAAPA,IAAUF,EAAQpB,EAAoBoB,IAC/B,EAAPE,EAAU,OAAOF,EACpB,GAAW,EAAPE,GAA8B,iBAAVF,GAAsBA,GAASA,EAAMG,WAAY,OAAOH,EAChF,IAAII,EAAKX,OAAOY,OAAO,MAGvB,GAFAzB,EAAoBiB,EAAEO,GACtBX,OAAOC,eAAeU,EAAI,UAAW,CAAET,YAAY,EAAMK,MAAOA,IACtD,EAAPE,GAA4B,iBAATF,EAAmB,IAAI,IAAIM,KAAON,EAAOpB,EAAoBS,EAAEe,EAAIE,EAAK,SAASA,GAAO,OAAON,EAAMM,IAAQC,KAAK,KAAMD,IAC9I,OAAOF,GAIRxB,EAAoB4B,EAAI,SAASzB,GAChC,IAAIQ,EAASR,GAAUA,EAAOoB,WAC7B,WAAwB,OAAOpB,EAAgB,SAC/C,WAA8B,OAAOA,GAEtC,OADAH,EAAoBS,EAAEE,EAAQ,IAAKA,GAC5BA,GAIRX,EAAoBY,EAAI,SAASiB,EAAQC,GAAY,OAAOjB,OAAOkB,UAAUC,eAAe1B,KAAKuB,EAAQC,IAGzG9B,EAAoBiC,EAAI,GAIjBjC,EAAoBA,EAAoBkC,EAAI,GAnFpD,CAsFC,CAEJ,SAAU/B,EAAQD,EAASF,IAEL,SAASG,GAAS,IAAIgC,EAAkCC,EAAS,SAAWC,GACpG,aAEA,IAAIC,EAAO,IAEPC,EAAU,iBACVC,EAAcC,EAAaF,GAG3BG,EAAyC,mBAAXC,OAElC,SAASC,EAAQC,EAAGC,EAAOC,EAAUC,GACjC,YAAiB,IAANH,EAA0BD,EAAQ,QACxB,IAAVE,IAAyC,KAAVA,GAAiBC,GAA2BE,EAAUJ,EAAGC,EAAOC,EAAUC,GAC7GE,EAAWL,GAGtB,SAASM,EAAW/B,EAAOgC,GACvBC,KAAKjC,MAAQA,EACbiC,KAAKD,KAAOA,EACZC,KAAKC,SAAU,EAInB,SAASC,EAAanC,GAClBiC,KAAKjC,MAAQA,EACbiC,KAAKD,KAAOhC,EAAQ,EACpBiC,KAAKC,SAAU,EAInB,SAASE,EAAapC,GAClBiC,KAAKjC,MAAQA,EAIjB,SAASqC,EAAU7B,GACf,OAAQW,EAAUX,GAAKA,EAAIW,EAG/B,SAASE,EAAab,GAClB,OAAIA,EAAI,IACG,CAACA,GACRA,EAAI,KACG,CAACA,EAAI,IAAK8B,KAAKC,MAAM/B,EAAI,MAC7B,CAACA,EAAI,IAAK8B,KAAKC,MAAM/B,EAAI,KAAO,IAAK8B,KAAKC,MAAM/B,EAAI,OAG/D,SAASgC,EAAaC,GAClBC,EAAKD,GACL,IAAIE,EAASF,EAAIE,OACjB,GAAIA,EAAS,GAAKC,EAAWH,EAAKrB,GAAe,EAC7C,OAAQuB,GACJ,KAAK,EAAG,OAAO,EACf,KAAK,EAAG,OAAOF,EAAI,GACnB,KAAK,EAAG,OAAOA,EAAI,GAAKA,EAAI,GAAKvB,EACjC,QAAS,OAAOuB,EAAI,IAAMA,EAAI,GAAKA,EAAI,GAAKvB,GAAQA,EAG5D,OAAOuB,EAGX,SAASC,EAAKjB,GAEV,IADA,IAAIzC,EAAIyC,EAAEkB,OACQ,IAAXlB,IAAIzC,KACXyC,EAAEkB,OAAS3D,EAAI,EAGnB,SAAS6D,EAAYF,GAGjB,IAFA,IAAIG,EAAI,IAAIC,MAAMJ,GACd3D,GAAK,IACAA,EAAI2D,GACTG,EAAE9D,GAAK,EAEX,OAAO8D,EAGX,SAASE,EAASxC,GACd,OAAIA,EAAI,EAAU8B,KAAKC,MAAM/B,GACtB8B,KAAKW,KAAKzC,GAGrB,SAAS0C,EAAIC,EAAGC,GACZ,IAKIC,EAAKrE,EALLsE,EAAMH,EAAER,OACRY,EAAMH,EAAET,OACR9C,EAAI,IAAIkD,MAAMO,GACdE,EAAQ,EACRC,EAAOvC,EAEX,IAAKlC,EAAI,EAAGA,EAAIuE,EAAKvE,IAEjBwE,GADAH,EAAMF,EAAEnE,GAAKoE,EAAEpE,GAAKwE,IACLC,EAAO,EAAI,EAC1B5D,EAAEb,GAAKqE,EAAMG,EAAQC,EAEzB,KAAOzE,EAAIsE,GAEPE,GADAH,EAAMF,EAAEnE,GAAKwE,KACGC,EAAO,EAAI,EAC3B5D,EAAEb,KAAOqE,EAAMG,EAAQC,EAG3B,OADID,EAAQ,GAAG3D,EAAE6D,KAAKF,GACf3D,EAGX,SAAS8D,EAAOR,EAAGC,GACf,OAAID,EAAER,QAAUS,EAAET,OAAeO,EAAIC,EAAGC,GACjCF,EAAIE,EAAGD,GAGlB,SAASS,EAAST,EAAGK,GACjB,IAGIH,EAAKrE,EAHLC,EAAIkE,EAAER,OACN9C,EAAI,IAAIkD,MAAM9D,GACdwE,EAAOvC,EAEX,IAAKlC,EAAI,EAAGA,EAAIC,EAAGD,IACfqE,EAAMF,EAAEnE,GAAKyE,EAAOD,EACpBA,EAAQlB,KAAKC,MAAMc,EAAMI,GACzB5D,EAAEb,GAAKqE,EAAMG,EAAQC,EACrBD,GAAS,EAEb,KAAOA,EAAQ,GACX3D,EAAEb,KAAOwE,EAAQC,EACjBD,EAAQlB,KAAKC,MAAMiB,EAAQC,GAE/B,OAAO5D,EAoCX,SAASgE,EAASV,EAAGC,GACjB,IAKIpE,EAAG8E,EALHC,EAAMZ,EAAER,OACRqB,EAAMZ,EAAET,OACR9C,EAAI,IAAIkD,MAAMgB,GACdE,EAAS,EAGb,IAAKjF,EAAI,EAAGA,EAAIgF,EAAKhF,KACjB8E,EAAaX,EAAEnE,GAAKiF,EAASb,EAAEpE,IACd,GACb8E,GALG5C,IAMH+C,EAAS,GACNA,EAAS,EAChBpE,EAAEb,GAAK8E,EAEX,IAAK9E,EAAIgF,EAAKhF,EAAI+E,EAAK/E,IAAK,CAExB,MADA8E,EAAaX,EAAEnE,GAAKiF,GACH,GACZ,CACDpE,EAAEb,KAAO8E,EACT,MAHgBA,GAZb5C,IAiBPrB,EAAEb,GAAK8E,EAEX,KAAO9E,EAAI+E,EAAK/E,IACZa,EAAEb,GAAKmE,EAAEnE,GAGb,OADA0D,EAAK7C,GACEA,EAmBX,SAASqE,EAAcf,EAAGC,EAAGpB,GACzB,IAIIhD,EAAG8E,EAJH7E,EAAIkE,EAAER,OACN9C,EAAI,IAAIkD,MAAM9D,GACduE,GAASJ,EAGb,IAAKpE,EAAI,EAAGA,EAAIC,EAAGD,IACf8E,EAAaX,EAAEnE,GAAKwE,EACpBA,EAAQlB,KAAKC,MAAMuB,EAJZ5C,KAKP4C,GALO5C,IAMPrB,EAAEb,GAAK8E,EAAa,EAAIA,EANjB5C,IAMqC4C,EAGhD,MAAiB,iBADjBjE,EAAI2C,EAAa3C,KAETmC,IAAMnC,GAAKA,GACR,IAAIsC,EAAatC,IACnB,IAAIkC,EAAWlC,EAAGmC,GA0D/B,SAASmC,EAAahB,EAAGC,GACrB,IAKIgB,EAASZ,EAAOxE,EAAGqF,EALnBN,EAAMZ,EAAER,OACRqB,EAAMZ,EAAET,OAER9C,EAAIgD,EADAkB,EAAMC,GAId,IAAKhF,EAAI,EAAGA,EAAI+E,IAAO/E,EAAG,CACtBqF,EAAMlB,EAAEnE,GACR,IAAK,IAAIsF,EAAI,EAAGA,EAAIN,IAAOM,EAEvBF,EAAUC,EADJjB,EAAEkB,GACczE,EAAEb,EAAIsF,GAC5Bd,EAAQlB,KAAKC,MAAM6B,EAPhBlD,KAQHrB,EAAEb,EAAIsF,GAAKF,EARRlD,IAQkBsC,EACrB3D,EAAEb,EAAIsF,EAAI,IAAMd,EAIxB,OADAd,EAAK7C,GACEA,EAGX,SAAS0E,EAAcpB,EAAGC,GACtB,IAIIgB,EAASpF,EAJTC,EAAIkE,EAAER,OACN9C,EAAI,IAAIkD,MAAM9D,GACdwE,EAAOvC,EACPsC,EAAQ,EAEZ,IAAKxE,EAAI,EAAGA,EAAIC,EAAGD,IACfoF,EAAUjB,EAAEnE,GAAKoE,EAAII,EACrBA,EAAQlB,KAAKC,MAAM6B,EAAUX,GAC7B5D,EAAEb,GAAKoF,EAAUZ,EAAQC,EAE7B,KAAOD,EAAQ,GACX3D,EAAEb,KAAOwE,EAAQC,EACjBD,EAAQlB,KAAKC,MAAMiB,EAAQC,GAE/B,OAAO5D,EAGX,SAAS2E,EAAU1B,EAAGtC,GAElB,IADA,IAAIX,EAAI,GACDW,KAAM,GAAGX,EAAE6D,KAAK,GACvB,OAAO7D,EAAE4E,OAAO3B,GAmDpB,SAAS4B,EAAsBvB,EAAGC,EAAGpB,GACjC,OACW,IAAID,EADXoB,EAAIjC,EACkBqD,EAAcnB,EAAGD,GAErBgB,EAAaf,EAAG/B,EAAa8B,IAFJnB,GA0BnD,SAAS2C,EAAOxB,GAEZ,IAGIiB,EAASZ,EAAOxE,EAAGqF,EAHnBpF,EAAIkE,EAAER,OACN9C,EAAIgD,EAAY5D,EAAIA,GAGxB,IAAKD,EAAI,EAAGA,EAAIC,EAAGD,IAAK,CAEpBwE,EAAQ,GADRa,EAAMlB,EAAEnE,IACUqF,EAClB,IAAK,IAAIC,EAAItF,EAAGsF,EAAIrF,EAAGqF,IAEnBF,EAAeC,EADTlB,EAAEmB,GACE,EAAkBzE,EAAEb,EAAIsF,GAAKd,EACvCA,EAAQlB,KAAKC,MAAM6B,EARhBlD,KASHrB,EAAEb,EAAIsF,GAAKF,EATRlD,IASkBsC,EAEzB3D,EAAEb,EAAIC,GAAKuE,EAGf,OADAd,EAAK7C,GACEA,EA6GX,SAAS+E,EAAY5E,EAAO6E,GACxB,IAGI7F,EAAG8F,EAAGC,EAAWC,EAHjBrC,EAAS3C,EAAM2C,OACfsC,EAAWpC,EAAYF,GAI3B,IADAoC,EAAY,EACP/F,EAAI2D,EAAS,EAAG3D,GAAK,IAAKA,EAG3B+F,GAFAC,EAJO9D,IAIG6D,EAAmB/E,EAAMhB,KACnC8F,EAAI9B,EAASgC,EAAUH,IACGA,EAC1BI,EAASjG,GAAS,EAAJ8F,EAElB,MAAO,CAACG,EAAsB,EAAZF,GAGtB,SAASG,EAAUC,EAAM1D,GACrB,IAAIzB,EAAOQ,EAAIsB,EAAWL,GAC1B,GAAIH,EACA,MAAO,CAAC,IAAIc,EAAa+C,EAAKnF,MAAQQ,EAAER,OAAQ,IAAIoC,EAAa+C,EAAKnF,MAAQQ,EAAER,QAEpF,IACIiF,EADA9B,EAAIgC,EAAKnF,MAAOoD,EAAI5C,EAAER,MAE1B,GAAU,IAANoD,EAAS,MAAM,IAAIgC,MAAM,yBAC7B,GAAID,EAAKjD,QACL,OAAI1B,EAAE0B,QACK,CAAC,IAAIC,EAAaa,EAASG,EAAIC,IAAK,IAAIjB,EAAagB,EAAIC,IAE7D,CAAC5B,EAAQ,GAAI2D,GAExB,GAAI3E,EAAE0B,QAAS,CACX,GAAU,IAANkB,EAAS,MAAO,CAAC+B,EAAM3D,EAAQ,IACnC,IAAU,GAAN4B,EAAS,MAAO,CAAC+B,EAAKE,SAAU7D,EAAQ,IAC5C,IAAI8D,EAAMhD,KAAKgD,IAAIlC,GACnB,GAAIkC,EAAMpE,EAAM,CAEZ+D,EAAWzC,GADXxC,EAAQ4E,EAAYzB,EAAGmC,IACO,IAC9B,IAAIP,EAAY/E,EAAM,GAEtB,OADImF,EAAKnD,OAAM+C,GAAaA,GACJ,iBAAbE,GACHE,EAAKnD,OAASxB,EAAEwB,OAAMiD,GAAYA,GAC/B,CAAC,IAAI9C,EAAa8C,GAAW,IAAI9C,EAAa4C,KAElD,CAAC,IAAIhD,EAAWkD,EAAUE,EAAKnD,OAASxB,EAAEwB,MAAO,IAAIG,EAAa4C,IAE7E3B,EAAI/B,EAAaiE,GAErB,IAAIC,EAAa3C,EAAWO,EAAGC,GAC/B,IAAoB,IAAhBmC,EAAmB,MAAO,CAAC/D,EAAQ,GAAI2D,GAC3C,GAAmB,IAAfI,EAAkB,MAAO,CAAC/D,EAAQ2D,EAAKnD,OAASxB,EAAEwB,KAAO,GAAK,GAAIR,EAAQ,IAO9EyD,GAHIjF,EADAmD,EAAER,OAASS,EAAET,QAAU,IA/I/B,SAAiBQ,EAAGC,GAChB,IASIoC,EAAeC,EAAOjC,EAAOS,EAAQjF,EAAGC,EAAG6F,EAT3Cf,EAAMZ,EAAER,OACRqB,EAAMZ,EAAET,OACRc,EAAOvC,EACPwE,EAAS7C,EAAYO,EAAET,QACvBgD,EAA8BvC,EAAEY,EAAM,GAEtCa,EAASvC,KAAKW,KAAKQ,GAAQ,EAAIkC,IAC/BZ,EAAYR,EAAcpB,EAAG0B,GAC7BG,EAAUT,EAAcnB,EAAGyB,GAK/B,IAHIE,EAAUpC,QAAUoB,GAAKgB,EAAUrB,KAAK,GAC5CsB,EAAQtB,KAAK,GACbiC,EAA8BX,EAAQhB,EAAM,GACvCyB,EAAQ1B,EAAMC,EAAKyB,GAAS,EAAGA,IAAS,CASzC,IARAD,EAAgB/B,EAAO,EACnBsB,EAAUU,EAAQzB,KAAS2B,IAC3BH,EAAgBlD,KAAKC,OAAOwC,EAAUU,EAAQzB,GAAOP,EAAOsB,EAAUU,EAAQzB,EAAM,IAAM2B,IAG9FnC,EAAQ,EACRS,EAAS,EACThF,EAAI+F,EAAQrC,OACP3D,EAAI,EAAGA,EAAIC,EAAGD,IACfwE,GAASgC,EAAgBR,EAAQhG,GACjC8F,EAAIxC,KAAKC,MAAMiB,EAAQC,GACvBQ,GAAUc,EAAUU,EAAQzG,IAAMwE,EAAQsB,EAAIrB,GAC9CD,EAAQsB,EACJb,EAAS,GACTc,EAAUU,EAAQzG,GAAKiF,EAASR,EAChCQ,GAAU,IAEVc,EAAUU,EAAQzG,GAAKiF,EACvBA,EAAS,GAGjB,KAAkB,IAAXA,GAAc,CAGjB,IAFAuB,GAAiB,EACjBhC,EAAQ,EACHxE,EAAI,EAAGA,EAAIC,EAAGD,KACfwE,GAASuB,EAAUU,EAAQzG,GAAKyE,EAAOuB,EAAQhG,IACnC,GACR+F,EAAUU,EAAQzG,GAAKwE,EAAQC,EAC/BD,EAAQ,IAERuB,EAAUU,EAAQzG,GAAKwE,EACvBA,EAAQ,GAGhBS,GAAUT,EAEdkC,EAAOD,GAASD,EAIpB,OADAT,EAAYH,EAAYG,EAAWF,GAAQ,GACpC,CAACrC,EAAakD,GAASlD,EAAauC,IAyF/Ba,CAAQzC,EAAGC,GAtF3B,SAAiBD,EAAGC,GAQhB,IANA,IAKIyC,EAAOC,EAAMC,EAAOC,EAAOC,EAL3BlC,EAAMZ,EAAER,OACRqB,EAAMZ,EAAET,OACR+C,EAAS,GACTQ,EAAO,GAGJnC,GAGH,GAFAmC,EAAKC,QAAQhD,IAAIY,IACjBrB,EAAKwD,GACDtD,EAAWsD,EAAM9C,GAAK,EACtBsC,EAAOhC,KAAK,OADhB,CAKAqC,EAVO7E,IAUCgF,GADRJ,EAAOI,EAAKvD,QACQ,GAAYuD,EAAKJ,EAAO,GAC5CE,EAXO9E,IAWCkC,EAAEY,EAAM,GAAYZ,EAAEY,EAAM,GAChC8B,EAAO9B,IACP+B,EAbG7E,KAaM6E,EAAQ,IAErBF,EAAQvD,KAAKW,KAAK8C,EAAQC,GAC1B,EAAG,CAEC,GAAIpD,EADJqD,EAAQ1B,EAAcnB,EAAGyC,GACHK,IAAS,EAAG,MAClCL,UACKA,GACTH,EAAOhC,KAAKmC,GACZK,EAAOrC,EAASqC,EAAMD,GAG1B,OADAP,EAAOU,UACA,CAAC5D,EAAakD,GAASlD,EAAa0D,IAwD9BG,CAAQlD,EAAGC,IAEP,GACjB,IAAIkD,EAAQnB,EAAKnD,OAASxB,EAAEwB,KACxBuE,EAAMvG,EAAM,GACZwG,EAAQrB,EAAKnD,KASjB,MARwB,iBAAbiD,GACHqB,IAAOrB,GAAYA,GACvBA,EAAW,IAAI9C,EAAa8C,IACzBA,EAAW,IAAIlD,EAAWkD,EAAUqB,GACxB,iBAARC,GACHC,IAAOD,GAAOA,GAClBA,EAAM,IAAIpE,EAAaoE,IACpBA,EAAM,IAAIxE,EAAWwE,EAAKC,GAC1B,CAACvB,EAAUsB,GAwGtB,SAAS3D,EAAWO,EAAGC,GACnB,GAAID,EAAER,SAAWS,EAAET,OACf,OAAOQ,EAAER,OAASS,EAAET,OAAS,GAAK,EAEtC,IAAK,IAAI3D,EAAImE,EAAER,OAAS,EAAG3D,GAAK,EAAGA,IAC/B,GAAImE,EAAEnE,KAAOoE,EAAEpE,GAAI,OAAOmE,EAAEnE,GAAKoE,EAAEpE,GAAK,GAAK,EAEjD,OAAO,EAoLX,SAASyH,EAAahF,GAClB,IAAIjB,EAAIiB,EAAE6D,MACV,OAAI9E,EAAEkG,cACFlG,EAAEmG,OAAO,IAAMnG,EAAEmG,OAAO,IAAMnG,EAAEmG,OAAO,OACvCnG,EAAEoG,UAAYpG,EAAEqG,cAAc,IAAMrG,EAAEqG,cAAc,QACpDrG,EAAEsG,OAAO,UAAb,IAIJ,SAASC,EAAgBvG,EAAG2C,GAKxB,IAJA,IAGI9D,EAAML,EAAG8D,EAHTkE,EAAQxG,EAAEyG,OACV7D,EAAI4D,EACJnH,EAAI,EAEDuD,EAAEwD,UAAUxD,EAAIA,EAAE8D,OAAO,GAAIrH,IACpCsH,EAAM,IAAKnI,EAAI,EAAGA,EAAImE,EAAER,OAAQ3D,IAC5B,IAAIwB,EAAEsG,OAAO3D,EAAEnE,OACf8D,EAAI9B,EAAOmC,EAAEnE,IAAIoI,OAAOhE,EAAG5C,IACrBkG,WAAY5D,EAAE6D,OAAOK,GAA3B,CACA,IAAK3H,EAAIQ,EAAI,EAAQ,GAALR,EAAQA,IAAK,CAEzB,IADAyD,EAAIA,EAAE6B,SAAS4B,IAAI/F,IACbkG,SAAU,OAAO,EACvB,GAAI5D,EAAE6D,OAAOK,GAAQ,SAASG,EAElC,OAAO,EAEX,OAAO,EA13BXpF,EAAWpB,UAAYlB,OAAOY,OAAOmB,EAAQb,WAO7CwB,EAAaxB,UAAYlB,OAAOY,OAAOmB,EAAQb,WAK/CyB,EAAazB,UAAYlB,OAAOY,OAAOmB,EAAQb,WA4F/CoB,EAAWpB,UAAUuC,IAAM,SAAUzB,GACjC,IAAIjB,EAAIsB,EAAWL,GACnB,GAAIQ,KAAKD,OAASxB,EAAEwB,KAChB,OAAOC,KAAK4B,SAASrD,EAAE6E,UAE3B,IAAIlC,EAAIlB,KAAKjC,MAAOoD,EAAI5C,EAAER,MAC1B,OAAIQ,EAAE0B,QACK,IAAIH,EAAW6B,EAAST,EAAGb,KAAKgD,IAAIlC,IAAKnB,KAAKD,MAElD,IAAID,EAAW4B,EAAOR,EAAGC,GAAInB,KAAKD,OAE7CD,EAAWpB,UAAU0G,KAAOtF,EAAWpB,UAAUuC,IAEjDf,EAAaxB,UAAUuC,IAAM,SAAUzB,GACnC,IAAIjB,EAAIsB,EAAWL,GACf0B,EAAIlB,KAAKjC,MACb,GAAImD,EAAI,IAAM3C,EAAEwB,KACZ,OAAOC,KAAK4B,SAASrD,EAAE6E,UAE3B,IAAIjC,EAAI5C,EAAER,MACV,GAAIQ,EAAE0B,QAAS,CACX,GAAIG,EAAUc,EAAIC,GAAI,OAAO,IAAIjB,EAAagB,EAAIC,GAClDA,EAAI/B,EAAaiB,KAAKgD,IAAIlC,IAE9B,OAAO,IAAIrB,EAAW6B,EAASR,EAAGd,KAAKgD,IAAInC,IAAKA,EAAI,IAExDhB,EAAaxB,UAAU0G,KAAOlF,EAAaxB,UAAUuC,IAErDd,EAAazB,UAAUuC,IAAM,SAAUzB,GACnC,OAAO,IAAIW,EAAaH,KAAKjC,MAAQ8B,EAAWL,GAAGzB,QAEvDoC,EAAazB,UAAU0G,KAAOjF,EAAazB,UAAUuC,IAoErDnB,EAAWpB,UAAUkD,SAAW,SAAUpC,GACtC,IAAIjB,EAAIsB,EAAWL,GACnB,GAAIQ,KAAKD,OAASxB,EAAEwB,KAChB,OAAOC,KAAKiB,IAAI1C,EAAE6E,UAEtB,IAAIlC,EAAIlB,KAAKjC,MAAOoD,EAAI5C,EAAER,MAC1B,OAAIQ,EAAE0B,QACKgC,EAAcf,EAAGb,KAAKgD,IAAIlC,GAAInB,KAAKD,MA1ClD,SAAqBmB,EAAGC,EAAGpB,GACvB,IAAIhC,EAQJ,OAPI4C,EAAWO,EAAGC,IAAM,EACpBpD,EAAQ6D,EAASV,EAAGC,IAEpBpD,EAAQ6D,EAAST,EAAGD,GACpBnB,GAAQA,GAGS,iBADrBhC,EAAQwC,EAAaxC,KAEbgC,IAAMhC,GAASA,GACZ,IAAImC,EAAanC,IAErB,IAAI+B,EAAW/B,EAAOgC,GA8BtBsF,CAAYnE,EAAGC,EAAGnB,KAAKD,OAElCD,EAAWpB,UAAU4G,MAAQxF,EAAWpB,UAAUkD,SAElD1B,EAAaxB,UAAUkD,SAAW,SAAUpC,GACxC,IAAIjB,EAAIsB,EAAWL,GACf0B,EAAIlB,KAAKjC,MACb,GAAImD,EAAI,IAAM3C,EAAEwB,KACZ,OAAOC,KAAKiB,IAAI1C,EAAE6E,UAEtB,IAAIjC,EAAI5C,EAAER,MACV,OAAIQ,EAAE0B,QACK,IAAIC,EAAagB,EAAIC,GAEzBc,EAAcd,EAAGd,KAAKgD,IAAInC,GAAIA,GAAK,IAE9ChB,EAAaxB,UAAU4G,MAAQpF,EAAaxB,UAAUkD,SAEtDzB,EAAazB,UAAUkD,SAAW,SAAUpC,GACxC,OAAO,IAAIW,EAAaH,KAAKjC,MAAQ8B,EAAWL,GAAGzB,QAEvDoC,EAAazB,UAAU4G,MAAQnF,EAAazB,UAAUkD,SAEtD9B,EAAWpB,UAAU0E,OAAS,WAC1B,OAAO,IAAItD,EAAWE,KAAKjC,OAAQiC,KAAKD,OAE5CG,EAAaxB,UAAU0E,OAAS,WAC5B,IAAIrD,EAAOC,KAAKD,KACZwF,EAAQ,IAAIrF,GAAcF,KAAKjC,OAEnC,OADAwH,EAAMxF,MAAQA,EACPwF,GAEXpF,EAAazB,UAAU0E,OAAS,WAC5B,OAAO,IAAIjD,GAAcH,KAAKjC,QAGlC+B,EAAWpB,UAAU2E,IAAM,WACvB,OAAO,IAAIvD,EAAWE,KAAKjC,OAAO,IAEtCmC,EAAaxB,UAAU2E,IAAM,WACzB,OAAO,IAAInD,EAAaG,KAAKgD,IAAIrD,KAAKjC,SAE1CoC,EAAazB,UAAU2E,IAAM,WACzB,OAAO,IAAIlD,EAAaH,KAAKjC,OAAS,EAAIiC,KAAKjC,OAASiC,KAAKjC,QA2EjE+B,EAAWpB,UAAU8G,SAAW,SAAUhG,GACtC,IAGI6D,EARcoC,EAAIC,EAKlBnH,EAAIsB,EAAWL,GACf0B,EAAIlB,KAAKjC,MAAOoD,EAAI5C,EAAER,MACtBgC,EAAOC,KAAKD,OAASxB,EAAEwB,KAE3B,GAAIxB,EAAE0B,QAAS,CACX,GAAU,IAANkB,EAAS,OAAO5B,EAAQ,GAC5B,GAAU,IAAN4B,EAAS,OAAOnB,KACpB,IAAW,IAAPmB,EAAU,OAAOnB,KAAKoD,SAE1B,IADAC,EAAMhD,KAAKgD,IAAIlC,IACLlC,EACN,OAAO,IAAIa,EAAWwC,EAAcpB,EAAGmC,GAAMtD,GAEjDoB,EAAI/B,EAAaiE,GAErB,OAnBkBoC,EAmBDvE,EAAER,OAnBGgF,EAmBKvE,EAAET,OAClB,IAAIZ,GAnBP,KAAQ2F,EAAK,KAAQC,EAAK,MAAWD,EAAKC,EAAK,EAvB3D,SAASC,EAAkB9E,EAAG+E,GAC1B,IAAIrH,EAAI8B,KAAKwF,IAAIhF,EAAEH,OAAQkF,EAAElF,QAE7B,GAAInC,GAAK,GAAI,OAAO2D,EAAarB,EAAG+E,GACpCrH,EAAI8B,KAAKW,KAAKzC,EAAI,GAElB,IAAI4C,EAAIN,EAAEiF,MAAMvH,GACZ2C,EAAIL,EAAEiF,MAAM,EAAGvH,GACfnB,EAAIwI,EAAEE,MAAMvH,GACZpB,EAAIyI,EAAEE,MAAM,EAAGvH,GAEfwH,EAAKJ,EAAkBzE,EAAG/D,GAC1B6I,EAAKL,EAAkBxE,EAAG/D,GAC1B6I,EAAON,EAAkBjE,EAAOR,EAAGC,GAAIO,EAAOvE,EAAGC,IAEjD+E,EAAUT,EAAOA,EAAOqE,EAAIxD,EAAUX,EAASA,EAASqE,EAAMF,GAAKC,GAAKzH,IAAKgE,EAAUyD,EAAI,EAAIzH,IAEnG,OADAkC,EAAK0B,GACEA,EAyBmBwD,CAAkBzE,EAAGC,GACzBe,EAAahB,EAAGC,GADapB,IAIvDD,EAAWpB,UAAUwH,MAAQpG,EAAWpB,UAAU8G,SAQlDtF,EAAaxB,UAAUyH,iBAAmB,SAAUjF,GAChD,OAAId,EAAUc,EAAEnD,MAAQiC,KAAKjC,OAClB,IAAImC,EAAagB,EAAEnD,MAAQiC,KAAKjC,OAEpC0E,EAAsBpC,KAAKgD,IAAInC,EAAEnD,OAAQqB,EAAaiB,KAAKgD,IAAIrD,KAAKjC,QAASiC,KAAKD,OAASmB,EAAEnB,OAExGD,EAAWpB,UAAUyH,iBAAmB,SAAUjF,GAC9C,OAAgB,IAAZA,EAAEnD,MAAoBwB,EAAQ,GAClB,IAAZ2B,EAAEnD,MAAoBiC,MACT,IAAbkB,EAAEnD,MAAqBiC,KAAKoD,SACzBX,EAAsBpC,KAAKgD,IAAInC,EAAEnD,OAAQiC,KAAKjC,MAAOiC,KAAKD,OAASmB,EAAEnB,OAEhFG,EAAaxB,UAAU8G,SAAW,SAAUhG,GACxC,OAAOK,EAAWL,GAAG2G,iBAAiBnG,OAE1CE,EAAaxB,UAAUwH,MAAQhG,EAAaxB,UAAU8G,SAEtDrF,EAAazB,UAAU8G,SAAW,SAAUhG,GACxC,OAAO,IAAIW,EAAaH,KAAKjC,MAAQ8B,EAAWL,GAAGzB,QAEvDoC,EAAazB,UAAUwH,MAAQ/F,EAAazB,UAAU8G,SAuBtD1F,EAAWpB,UAAUgE,OAAS,WAC1B,OAAO,IAAI5C,EAAW4C,EAAO1C,KAAKjC,QAAQ,IAG9CmC,EAAaxB,UAAUgE,OAAS,WAC5B,IAAI3E,EAAQiC,KAAKjC,MAAQiC,KAAKjC,MAC9B,OAAIqC,EAAUrC,GAAe,IAAImC,EAAanC,GACvC,IAAI+B,EAAW4C,EAAOtD,EAAaiB,KAAKgD,IAAIrD,KAAKjC,UAAU,IAGtEoC,EAAazB,UAAUgE,OAAS,SAAUlD,GACtC,OAAO,IAAIW,EAAaH,KAAKjC,MAAQiC,KAAKjC,QAqK9C+B,EAAWpB,UAAU0H,OAAS,SAAU5G,GACpC,IAAIiE,EAASR,EAAUjD,KAAMR,GAC7B,MAAO,CACHwD,SAAUS,EAAO,GACjBX,UAAWW,EAAO,KAG1BtD,EAAazB,UAAU0H,OAASlG,EAAaxB,UAAU0H,OAAStG,EAAWpB,UAAU0H,OAGrFtG,EAAWpB,UAAUuG,OAAS,SAAUzF,GACpC,OAAOyD,EAAUjD,KAAMR,GAAG,IAE9BW,EAAazB,UAAU2H,KAAOlG,EAAazB,UAAUuG,OAAS,SAAUzF,GACpE,OAAO,IAAIW,EAAaH,KAAKjC,MAAQ8B,EAAWL,GAAGzB,QAEvDmC,EAAaxB,UAAU2H,KAAOnG,EAAaxB,UAAUuG,OAASnF,EAAWpB,UAAU2H,KAAOvG,EAAWpB,UAAUuG,OAE/GnF,EAAWpB,UAAU4F,IAAM,SAAU9E,GACjC,OAAOyD,EAAUjD,KAAMR,GAAG,IAE9BW,EAAazB,UAAU4F,IAAMnE,EAAazB,UAAUoE,UAAY,SAAUtD,GACtE,OAAO,IAAIW,EAAaH,KAAKjC,MAAQ8B,EAAWL,GAAGzB,QAEvDmC,EAAaxB,UAAUoE,UAAY5C,EAAaxB,UAAU4F,IAAMxE,EAAWpB,UAAUoE,UAAYhD,EAAWpB,UAAU4F,IAEtHxE,EAAWpB,UAAU4H,IAAM,SAAU9G,GACjC,IAGIzB,EAAO8C,EAAG+E,EAHVrH,EAAIsB,EAAWL,GACf0B,EAAIlB,KAAKjC,MACToD,EAAI5C,EAAER,MAEV,GAAU,IAANoD,EAAS,OAAO5B,EAAQ,GAC5B,GAAU,IAAN2B,EAAS,OAAO3B,EAAQ,GAC5B,GAAU,IAAN2B,EAAS,OAAO3B,EAAQ,GAC5B,IAAW,IAAP2B,EAAU,OAAO3C,EAAEoG,SAAWpF,EAAQ,GAAKA,GAAS,GACxD,GAAIhB,EAAEwB,KACF,OAAOR,EAAQ,GAEnB,IAAKhB,EAAE0B,QAAS,MAAM,IAAIkD,MAAM,gBAAkB5E,EAAEgI,WAAa,kBACjE,GAAIvG,KAAKC,SACDG,EAAUrC,EAAQsC,KAAKiG,IAAIpF,EAAGC,IAC9B,OAAO,IAAIjB,EAAaa,EAAShD,IAIzC,IAFA8C,EAAIb,KACJ4F,EAAIrG,EAAQ,IAEA,EAAJ4B,IACAyE,EAAIA,EAAEM,MAAMrF,KACVM,GAEI,IAANA,GACJA,GAAK,EACLN,EAAIA,EAAE6B,SAEV,OAAOkD,GAEX1F,EAAaxB,UAAU4H,IAAMxG,EAAWpB,UAAU4H,IAElDnG,EAAazB,UAAU4H,IAAM,SAAU9G,GACnC,IAAIjB,EAAIsB,EAAWL,GACf0B,EAAIlB,KAAKjC,MAAOoD,EAAI5C,EAAER,MACtByI,EAAKlH,OAAO,GAAImH,EAAKnH,OAAO,GAAIoH,EAAKpH,OAAO,GAChD,GAAI6B,IAAMqF,EAAI,OAAOjH,EAAQ,GAC7B,GAAI2B,IAAMsF,EAAI,OAAOjH,EAAQ,GAC7B,GAAI2B,IAAMuF,EAAI,OAAOlH,EAAQ,GAC7B,GAAI2B,IAAM5B,QAAQ,GAAI,OAAOf,EAAEoG,SAAWpF,EAAQ,GAAKA,GAAS,GAChE,GAAIhB,EAAEoI,aAAc,OAAO,IAAIxG,EAAaqG,GAG5C,IAFA,IAAI3F,EAAIb,KACJ4F,EAAIrG,EAAQ,IAEP4B,EAAIsF,KAAQA,IACbb,EAAIA,EAAEM,MAAMrF,KACVM,GAEFA,IAAMqF,GACVrF,GAAKuF,EACL7F,EAAIA,EAAE6B,SAEV,OAAOkD,GAGX9F,EAAWpB,UAAUyG,OAAS,SAAUyB,EAAKtC,GAGzC,GAFAsC,EAAM/G,EAAW+G,IACjBtC,EAAMzE,EAAWyE,IACTuC,SAAU,MAAM,IAAI1D,MAAM,qCAClC,IAAIvF,EAAI2B,EAAQ,GACZiC,EAAOxB,KAAKsE,IAAIA,GAKpB,IAJIsC,EAAID,eACJC,EAAMA,EAAIpB,SAASjG,GAAS,IAC5BiC,EAAOA,EAAKsF,OAAOxC,IAEhBsC,EAAIG,cAAc,CACrB,GAAIvF,EAAKqF,SAAU,OAAOtH,EAAQ,GAC9BqH,EAAII,UAASpJ,EAAIA,EAAE4H,SAAShE,GAAM8C,IAAIA,IAC1CsC,EAAMA,EAAI3B,OAAO,GACjBzD,EAAOA,EAAKkB,SAAS4B,IAAIA,GAE7B,OAAO1G,GAEXuC,EAAazB,UAAUyG,OAASjF,EAAaxB,UAAUyG,OAASrF,EAAWpB,UAAUyG,OAYrFrF,EAAWpB,UAAUiC,WAAa,SAAUnB,GACxC,IAAIjB,EAAIsB,EAAWL,GACf0B,EAAIlB,KAAKjC,MACToD,EAAI5C,EAAER,MACV,OAAIQ,EAAE0B,QAAgB,EACfU,EAAWO,EAAGC,IAEzBjB,EAAaxB,UAAUiC,WAAa,SAAUnB,GAC1C,IAAIjB,EAAIsB,EAAWL,GACf0B,EAAIb,KAAKgD,IAAIrD,KAAKjC,OAClBoD,EAAI5C,EAAER,MACV,OAAIQ,EAAE0B,QAEKiB,KADPC,EAAId,KAAKgD,IAAIlC,IACI,EAAID,EAAIC,EAAI,GAAK,GAE9B,GAEZhB,EAAazB,UAAUiC,WAAa,SAAUnB,GAC1C,IAAI0B,EAAIlB,KAAKjC,MACToD,EAAItB,EAAWL,GAAGzB,MAGtB,OAFAmD,EAAIA,GAAK,EAAIA,GAAKA,MAClBC,EAAIA,GAAK,EAAIA,GAAKA,GACD,EAAID,EAAIC,EAAI,GAAK,GAGtCrB,EAAWpB,UAAUuI,QAAU,SAAUzH,GAGrC,GAAIA,IAAM0H,IACN,OAAQ,EAEZ,GAAI1H,KAAO0H,IACP,OAAO,EAGX,IAAI3I,EAAIsB,EAAWL,GACf0B,EAAIlB,KAAKjC,MACToD,EAAI5C,EAAER,MACV,OAAIiC,KAAKD,OAASxB,EAAEwB,KACTxB,EAAEwB,KAAO,GAAK,EAErBxB,EAAE0B,QACKD,KAAKD,MAAQ,EAAI,EAErBY,EAAWO,EAAGC,IAAMnB,KAAKD,MAAQ,EAAI,IAEhDD,EAAWpB,UAAUyI,UAAYrH,EAAWpB,UAAUuI,QAEtD/G,EAAaxB,UAAUuI,QAAU,SAAUzH,GACvC,GAAIA,IAAM0H,IACN,OAAQ,EAEZ,GAAI1H,KAAO0H,IACP,OAAO,EAGX,IAAI3I,EAAIsB,EAAWL,GACf0B,EAAIlB,KAAKjC,MACToD,EAAI5C,EAAER,MACV,OAAIQ,EAAE0B,QACKiB,GAAKC,EAAI,EAAID,EAAIC,EAAI,GAAK,EAEjCD,EAAI,IAAM3C,EAAEwB,KACLmB,EAAI,GAAK,EAAI,EAEjBA,EAAI,EAAI,GAAK,GAExBhB,EAAaxB,UAAUyI,UAAYjH,EAAaxB,UAAUuI,QAE1D9G,EAAazB,UAAUuI,QAAU,SAAUzH,GACvC,GAAIA,IAAM0H,IACN,OAAQ,EAEZ,GAAI1H,KAAO0H,IACP,OAAO,EAEX,IAAIhG,EAAIlB,KAAKjC,MACToD,EAAItB,EAAWL,GAAGzB,MACtB,OAAOmD,IAAMC,EAAI,EAAID,EAAIC,EAAI,GAAK,GAEtChB,EAAazB,UAAUyI,UAAYhH,EAAazB,UAAUuI,QAE1DnH,EAAWpB,UAAUgG,OAAS,SAAUlF,GACpC,OAA2B,IAApBQ,KAAKiH,QAAQzH,IAExBW,EAAazB,UAAU0I,GAAKjH,EAAazB,UAAUgG,OAASxE,EAAaxB,UAAU0I,GAAKlH,EAAaxB,UAAUgG,OAAS5E,EAAWpB,UAAU0I,GAAKtH,EAAWpB,UAAUgG,OAEvK5E,EAAWpB,UAAU2I,UAAY,SAAU7H,GACvC,OAA2B,IAApBQ,KAAKiH,QAAQzH,IAExBW,EAAazB,UAAU4I,IAAMnH,EAAazB,UAAU2I,UAAYnH,EAAaxB,UAAU4I,IAAMpH,EAAaxB,UAAU2I,UAAYvH,EAAWpB,UAAU4I,IAAMxH,EAAWpB,UAAU2I,UAEhLvH,EAAWpB,UAAU6I,QAAU,SAAU/H,GACrC,OAAOQ,KAAKiH,QAAQzH,GAAK,GAE7BW,EAAazB,UAAU8I,GAAKrH,EAAazB,UAAU6I,QAAUrH,EAAaxB,UAAU8I,GAAKtH,EAAaxB,UAAU6I,QAAUzH,EAAWpB,UAAU8I,GAAK1H,EAAWpB,UAAU6I,QAEzKzH,EAAWpB,UAAUmG,OAAS,SAAUrF,GACpC,OAAOQ,KAAKiH,QAAQzH,GAAK,GAE7BW,EAAazB,UAAU+I,GAAKtH,EAAazB,UAAUmG,OAAS3E,EAAaxB,UAAU+I,GAAKvH,EAAaxB,UAAUmG,OAAS/E,EAAWpB,UAAU+I,GAAK3H,EAAWpB,UAAUmG,OAEvK/E,EAAWpB,UAAUgJ,gBAAkB,SAAUlI,GAC7C,OAAOQ,KAAKiH,QAAQzH,IAAM,GAE9BW,EAAazB,UAAUiJ,IAAMxH,EAAazB,UAAUgJ,gBAAkBxH,EAAaxB,UAAUiJ,IAAMzH,EAAaxB,UAAUgJ,gBAAkB5H,EAAWpB,UAAUiJ,IAAM7H,EAAWpB,UAAUgJ,gBAE5L5H,EAAWpB,UAAUkJ,eAAiB,SAAUpI,GAC5C,OAAOQ,KAAKiH,QAAQzH,IAAM,GAE9BW,EAAazB,UAAUmJ,IAAM1H,EAAazB,UAAUkJ,eAAiB1H,EAAaxB,UAAUmJ,IAAM3H,EAAaxB,UAAUkJ,eAAiB9H,EAAWpB,UAAUmJ,IAAM/H,EAAWpB,UAAUkJ,eAE1L9H,EAAWpB,UAAUiG,OAAS,WAC1B,OAA+B,IAAP,EAAhB3E,KAAKjC,MAAM,KAEvBmC,EAAaxB,UAAUiG,OAAS,WAC5B,OAA4B,IAAP,EAAb3E,KAAKjC,QAEjBoC,EAAazB,UAAUiG,OAAS,WAC5B,OAAQ3E,KAAKjC,MAAQuB,OAAO,MAAQA,OAAO,IAG/CQ,EAAWpB,UAAUsI,MAAQ,WACzB,OAA+B,IAAP,EAAhBhH,KAAKjC,MAAM,KAEvBmC,EAAaxB,UAAUsI,MAAQ,WAC3B,OAA4B,IAAP,EAAbhH,KAAKjC,QAEjBoC,EAAazB,UAAUsI,MAAQ,WAC3B,OAAQhH,KAAKjC,MAAQuB,OAAO,MAAQA,OAAO,IAG/CQ,EAAWpB,UAAUqI,WAAa,WAC9B,OAAQ/G,KAAKD,MAEjBG,EAAaxB,UAAUqI,WAAa,WAChC,OAAO/G,KAAKjC,MAAQ,GAExBoC,EAAazB,UAAUqI,WAAa7G,EAAaxB,UAAUqI,WAE3DjH,EAAWpB,UAAUiI,WAAa,WAC9B,OAAO3G,KAAKD,MAEhBG,EAAaxB,UAAUiI,WAAa,WAChC,OAAO3G,KAAKjC,MAAQ,GAExBoC,EAAazB,UAAUiI,WAAazG,EAAaxB,UAAUiI,WAE3D7G,EAAWpB,UAAU+F,OAAS,WAC1B,OAAO,GAEXvE,EAAaxB,UAAU+F,OAAS,WAC5B,OAAgC,IAAzBpE,KAAKgD,IAAIrD,KAAKjC,QAEzBoC,EAAazB,UAAU+F,OAAS,WAC5B,OAAOzE,KAAKqD,MAAMtF,QAAUuB,OAAO,IAGvCQ,EAAWpB,UAAUmI,OAAS,WAC1B,OAAO,GAEX3G,EAAaxB,UAAUmI,OAAS,WAC5B,OAAsB,IAAf7G,KAAKjC,OAEhBoC,EAAazB,UAAUmI,OAAS,WAC5B,OAAO7G,KAAKjC,QAAUuB,OAAO,IAGjCQ,EAAWpB,UAAUkG,cAAgB,SAAUpF,GAC3C,IAAIjB,EAAIsB,EAAWL,GACnB,OAAIjB,EAAEsI,aACFtI,EAAEkG,WACkB,IAApBlG,EAAEoC,WAAW,GAAiBX,KAAK2E,SAChC3E,KAAKsE,IAAI/F,GAAGsI,YAEvB1G,EAAazB,UAAUkG,cAAgB1E,EAAaxB,UAAUkG,cAAgB9E,EAAWpB,UAAUkG,cAgCnG9E,EAAWpB,UAAUoJ,QAAU,SAAUC,GACrC,IAAID,EAAUtD,EAAaxE,MAC3B,QAt5BqF,IAs5BjF8H,EAAuB,OAAOA,EAClC,IAAIvJ,EAAIyB,KAAKqD,MACT2E,EAAOzJ,EAAE0J,YACb,GAAID,GAAQ,GACR,OAAOlD,EAAgBvG,EAAG,CAAC,EAAG,EAAG,EAAG,EAAG,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,GAAI,KAGvE,IAFA,IAAI2J,EAAO7H,KAAK8H,IAAI,GAAKH,EAAKI,aAC1BpK,EAAIqC,KAAKW,MAAiB,IAAX+G,EAAoB,EAAI1H,KAAKiG,IAAI4B,EAAM,GAAMA,GACvDhH,EAAI,GAAInE,EAAI,EAAGA,EAAIiB,EAAGjB,IAC3BmE,EAAEO,KAAK1C,EAAOhC,EAAI,IAEtB,OAAO+H,EAAgBvG,EAAG2C,IAE9Bf,EAAazB,UAAUoJ,QAAU5H,EAAaxB,UAAUoJ,QAAUhI,EAAWpB,UAAUoJ,QAEvFhI,EAAWpB,UAAU2J,gBAAkB,SAAUC,EAAYC,GACzD,IAAIT,EAAUtD,EAAaxE,MAC3B,QAt6BqF,IAs6BjF8H,EAAuB,OAAOA,EAGlC,IAFA,IAAIvJ,EAAIyB,KAAKqD,MACTrF,OAx6BiF,IAw6B7EsK,EAA2B,EAAIA,EAC9BpH,EAAI,GAAInE,EAAI,EAAGA,EAAIiB,EAAGjB,IAC3BmE,EAAEO,KAAK1C,EAAOyJ,YAAY,EAAGjK,EAAE+G,MAAM,GAAIiD,IAE7C,OAAOzD,EAAgBvG,EAAG2C,IAE9Bf,EAAazB,UAAU2J,gBAAkBnI,EAAaxB,UAAU2J,gBAAkBvI,EAAWpB,UAAU2J,gBAEvGvI,EAAWpB,UAAUoI,OAAS,SAAUvI,GAEpC,IADA,IAA8EsE,EAAG4F,EAAOC,EAApF1K,EAAIe,EAAO4J,KAAMC,EAAO7J,EAAO8J,IAAKjL,EAAIiC,EAAWtB,GAAIuK,EAAO9I,KAAKqD,OAC/DyF,EAAKjC,UACThE,EAAIjF,EAAEqH,OAAO6D,GACbL,EAAQzK,EACR0K,EAAQ9K,EACRI,EAAI4K,EACJhL,EAAIkL,EACJF,EAAOH,EAAM7G,SAASiB,EAAE2C,SAASoD,IACjCE,EAAOJ,EAAM9G,SAASiB,EAAE2C,SAASsD,IAErC,IAAKlL,EAAE6G,SAAU,MAAM,IAAItB,MAAMnD,KAAKuG,WAAa,QAAUhI,EAAEgI,WAAa,qBAI5E,OAHsB,IAAlBvI,EAAEiJ,QAAQ,KACVjJ,EAAIA,EAAEiD,IAAI1C,IAEVyB,KAAK2G,aACE3I,EAAEoF,SAENpF,GAGXmC,EAAazB,UAAUoI,OAAS5G,EAAaxB,UAAUoI,OAAShH,EAAWpB,UAAUoI,OAErFhH,EAAWpB,UAAUwG,KAAO,WACxB,IAAInH,EAAQiC,KAAKjC,MACjB,OAAIiC,KAAKD,KACEkC,EAAclE,EAAO,EAAGiC,KAAKD,MAEjC,IAAID,EAAW6B,EAAS5D,EAAO,GAAIiC,KAAKD,OAEnDG,EAAaxB,UAAUwG,KAAO,WAC1B,IAAInH,EAAQiC,KAAKjC,MACjB,OAAIA,EAAQ,EAAImB,EAAgB,IAAIgB,EAAanC,EAAQ,GAClD,IAAI+B,EAAWX,GAAa,IAEvCgB,EAAazB,UAAUwG,KAAO,WAC1B,OAAO,IAAI/E,EAAaH,KAAKjC,MAAQuB,OAAO,KAGhDQ,EAAWpB,UAAUsG,KAAO,WACxB,IAAIjH,EAAQiC,KAAKjC,MACjB,OAAIiC,KAAKD,KACE,IAAID,EAAW6B,EAAS5D,EAAO,IAAI,GAEvCkE,EAAclE,EAAO,EAAGiC,KAAKD,OAExCG,EAAaxB,UAAUsG,KAAO,WAC1B,IAAIjH,EAAQiC,KAAKjC,MACjB,OAAIA,EAAQ,GAAKmB,EAAgB,IAAIgB,EAAanC,EAAQ,GACnD,IAAI+B,EAAWX,GAAa,IAEvCgB,EAAazB,UAAUsG,KAAO,WAC1B,OAAO,IAAI7E,EAAaH,KAAKjC,MAAQuB,OAAO,KAIhD,IADA,IAAIyJ,EAAc,CAAC,GACZ,EAAIA,EAAYA,EAAYrI,OAAS,IAAMzB,GAAM8J,EAAYtH,KAAK,EAAIsH,EAAYA,EAAYrI,OAAS,IAC9G,IAAIsI,EAAgBD,EAAYrI,OAAQuI,EAAgBF,EAAYC,EAAgB,GAEpF,SAASE,EAAc3K,GACnB,OAAO8B,KAAKgD,IAAI9E,IAAMU,EAsC1B,SAASkK,EAAQtI,EAAG+E,EAAGwD,GACnBxD,EAAI/F,EAAW+F,GAOf,IANA,IAAIyD,EAAQxI,EAAE8F,aAAc2C,EAAQ1D,EAAEe,aAClC4C,EAAOF,EAAQxI,EAAE2I,MAAQ3I,EACzB4I,EAAOH,EAAQ1D,EAAE4D,MAAQ5D,EACzB8D,EAAS,EAAGC,EAAS,EACrBC,EAAU,KAAMC,EAAU,KAC1BpG,EAAS,IACL8F,EAAK1C,WAAa4C,EAAK5C,UAE3B6C,GADAE,EAAU3G,EAAUsG,EAAMN,IACT,GAAGb,aAChBiB,IACAK,EAAST,EAAgB,EAAIS,GAIjCC,GADAE,EAAU5G,EAAUwG,EAAMR,IACT,GAAGb,aAChBkB,IACAK,EAASV,EAAgB,EAAIU,GAGjCJ,EAAOK,EAAQ,GACfH,EAAOI,EAAQ,GACfpG,EAAOhC,KAAK2H,EAAGM,EAAQC,IAG3B,IADA,IAAIvI,EAA2C,IAArCgI,EAAGC,EAAQ,EAAI,EAAGC,EAAQ,EAAI,GAAWvK,GAAQ,GAAKA,EAAO,GAC9DhC,EAAI0G,EAAO/C,OAAS,EAAG3D,GAAK,EAAGA,GAAK,EACzCqE,EAAMA,EAAIoE,SAASyD,GAAehI,IAAIlC,EAAO0E,EAAO1G,KAExD,OAAOqE,EAhEXtB,EAAWpB,UAAU6D,UAAY,SAAU/C,GACvC,IAAIjB,EAAIsB,EAAWL,GAAG4I,aACtB,IAAKc,EAAc3K,GACf,MAAM,IAAI4E,MAAM2G,OAAOvL,GAAK,+BAEhC,GAAIA,EAAI,EAAG,OAAOyB,KAAK+J,YAAYxL,GACnC,IAAIkF,EAASzD,KACb,GAAIyD,EAAOoD,SAAU,OAAOpD,EAC5B,KAAOlF,GAAKyK,GACRvF,EAASA,EAAO+B,SAASyD,GACzB1K,GAAKyK,EAAgB,EAEzB,OAAOvF,EAAO+B,SAASuD,EAAYxK,KAEvC4B,EAAazB,UAAU6D,UAAYrC,EAAaxB,UAAU6D,UAAYzC,EAAWpB,UAAU6D,UAE3FzC,EAAWpB,UAAUqL,WAAa,SAAUvK,GACxC,IAAIwK,EACAzL,EAAIsB,EAAWL,GAAG4I,aACtB,IAAKc,EAAc3K,GACf,MAAM,IAAI4E,MAAM2G,OAAOvL,GAAK,+BAEhC,GAAIA,EAAI,EAAG,OAAOyB,KAAKuC,WAAWhE,GAElC,IADA,IAAIkF,EAASzD,KACNzB,GAAKyK,GAAe,CACvB,GAAIvF,EAAOoD,UAAapD,EAAOkD,cAAgBlD,EAAOgB,SAAW,OAAOhB,EAExEA,GADAuG,EAAS/G,EAAUQ,EAAQwF,IACX,GAAGtC,aAAeqD,EAAO,GAAGhF,OAASgF,EAAO,GAC5DzL,GAAKyK,EAAgB,EAGzB,OADAgB,EAAS/G,EAAUQ,EAAQsF,EAAYxK,KACzB,GAAGoI,aAAeqD,EAAO,GAAGhF,OAASgF,EAAO,IAE9D7J,EAAazB,UAAUqL,WAAa7J,EAAaxB,UAAUqL,WAAajK,EAAWpB,UAAUqL,WAkC7FjK,EAAWpB,UAAU8K,IAAM,WACvB,OAAOxJ,KAAKoD,SAAS4B,QAEzB7E,EAAazB,UAAU8K,IAAMtJ,EAAaxB,UAAU8K,IAAM1J,EAAWpB,UAAU8K,IAE/E1J,EAAWpB,UAAUuL,IAAM,SAAU1L,GACjC,OAAO4K,EAAQnJ,KAAMzB,GAAG,SAAU2C,EAAGC,GAAK,OAAOD,EAAIC,MAEzDhB,EAAazB,UAAUuL,IAAM/J,EAAaxB,UAAUuL,IAAMnK,EAAWpB,UAAUuL,IAE/EnK,EAAWpB,UAAUwL,GAAK,SAAU3L,GAChC,OAAO4K,EAAQnJ,KAAMzB,GAAG,SAAU2C,EAAGC,GAAK,OAAOD,EAAIC,MAEzDhB,EAAazB,UAAUwL,GAAKhK,EAAaxB,UAAUwL,GAAKpK,EAAWpB,UAAUwL,GAE7EpK,EAAWpB,UAAUyL,IAAM,SAAU5L,GACjC,OAAO4K,EAAQnJ,KAAMzB,GAAG,SAAU2C,EAAGC,GAAK,OAAOD,EAAIC,MAEzDhB,EAAazB,UAAUyL,IAAMjK,EAAaxB,UAAUyL,IAAMrK,EAAWpB,UAAUyL,IAG/E,SAASC,EAAS7L,GAGd,IAAIiB,EAAIjB,EAAER,MACN8C,EAAiB,iBAANrB,EAAiBA,EALpB,GAAK,GAMI,iBAANA,EAAiBA,EAAIF,OANxB,GAAK,IAOLE,EAAE,GAAKA,EAAE,GAAKP,EAPQ,WAQlC,OAAO4B,GAAKA,EA0BhB,SAASgF,EAAI3E,EAAGC,GAGZ,OAFAD,EAAIrB,EAAWqB,GACfC,EAAItB,EAAWsB,GACRD,EAAEqG,QAAQpG,GAAKD,EAAIC,EAE9B,SAASkJ,EAAInJ,EAAGC,GAGZ,OAFAD,EAAIrB,EAAWqB,GACfC,EAAItB,EAAWsB,GACRD,EAAE2D,OAAO1D,GAAKD,EAAIC,EAE7B,SAASmJ,EAAIpJ,EAAGC,GAGZ,GAFAD,EAAIrB,EAAWqB,GAAGmC,MAClBlC,EAAItB,EAAWsB,GAAGkC,MACdnC,EAAEwD,OAAOvD,GAAI,OAAOD,EACxB,GAAIA,EAAE2F,SAAU,OAAO1F,EACvB,GAAIA,EAAE0F,SAAU,OAAO3F,EAEvB,IADA,IAAoB9D,EAAGY,EAAnBb,EAAIoC,EAAQ,GACT2B,EAAEyD,UAAYxD,EAAEwD,UACnBvH,EAAIiN,EAAID,EAASlJ,GAAIkJ,EAASjJ,IAC9BD,EAAIA,EAAE+D,OAAO7H,GACb+D,EAAIA,EAAE8D,OAAO7H,GACbD,EAAIA,EAAEqI,SAASpI,GAEnB,KAAO8D,EAAEyD,UACLzD,EAAIA,EAAE+D,OAAOmF,EAASlJ,IAE1B,EAAG,CACC,KAAOC,EAAEwD,UACLxD,EAAIA,EAAE8D,OAAOmF,EAASjJ,IAEtBD,EAAEqG,QAAQpG,KACVnD,EAAImD,EAAGA,EAAID,EAAGA,EAAIlD,GAEtBmD,EAAIA,EAAES,SAASV,UACTC,EAAE0F,UACZ,OAAO1J,EAAEsH,SAAWvD,EAAIA,EAAEsE,SAASrI,GA/CvC2C,EAAWpB,UAAUuJ,UAAY,WAC7B,IAAI1J,EAAIyB,KAIR,OAHIzB,EAAE4I,UAAUpI,EAAO,IAAM,IACzBR,EAAIA,EAAE6E,SAASxB,SAAS7C,EAAO,KAEJ,IAA3BR,EAAE4I,UAAUpI,EAAO,IACZA,EAAO,GAEXA,EAnBX,SAASwL,EAAiBxM,EAAOyD,GAC7B,GAAIA,EAAK2F,UAAUpJ,IAAU,EAAG,CAC5B,IAAIyM,EAAMD,EAAiBxM,EAAOyD,EAAKkB,OAAOlB,IAC1C5C,EAAI4L,EAAI5L,EACR6L,EAAID,EAAIC,EACRzM,EAAIY,EAAE4G,SAAShE,GACnB,OAAOxD,EAAEmJ,UAAUpJ,IAAU,EAAI,CAAEa,EAAGZ,EAAGyM,EAAO,EAAJA,EAAQ,GAAM,CAAE7L,EAAGA,EAAG6L,EAAO,EAAJA,GAEzE,MAAO,CAAE7L,EAAGG,EAAO,GAAI0L,EAAG,GAWZF,CAAiBhM,EAAGQ,EAAO,IAAI0L,GAAGxJ,IAAIlC,EAAO,KAE/DoB,EAAazB,UAAUuJ,UAAY/H,EAAaxB,UAAUuJ,UAAYnI,EAAWpB,UAAUuJ,UA8D3F,IAAIrI,EAAY,SAAU8K,EAAMlJ,EAAM9B,EAAUC,GAC5CD,EAAWA,GA9pCQ,uCA+pCnBgL,EAAOZ,OAAOY,GACT/K,IACD+K,EAAOA,EAAKC,cACZjL,EAAWA,EAASiL,eAExB,IACI5N,EADA2D,EAASgK,EAAKhK,OAEdkK,EAAUvK,KAAKgD,IAAI7B,GACnBqJ,EAAiB,GACrB,IAAK9N,EAAI,EAAGA,EAAI2C,EAASgB,OAAQ3D,IAC7B8N,EAAenL,EAAS3C,IAAMA,EAElC,IAAKA,EAAI,EAAGA,EAAI2D,EAAQ3D,IAAK,CAEzB,GAAU,OADNI,EAAIuN,EAAK3N,MAETI,KAAK0N,GACDA,EAAe1N,IAAMyN,GAAS,CAC9B,GAAU,MAANzN,GAAyB,IAAZyN,EAAe,SAChC,MAAM,IAAIzH,MAAMhG,EAAI,iCAAmCqE,EAAO,MAI1EA,EAAO3B,EAAW2B,GAClB,IAAIsJ,EAAS,GACTnE,EAAyB,MAAZ+D,EAAK,GACtB,IAAK3N,EAAI4J,EAAa,EAAI,EAAG5J,EAAI2N,EAAKhK,OAAQ3D,IAAK,CAC/C,IAAII,EACJ,IADIA,EAAIuN,EAAK3N,MACJ8N,EAAgBC,EAAOrJ,KAAK5B,EAAWgL,EAAe1N,SAC1D,IAAU,MAANA,EAKJ,MAAM,IAAIgG,MAAMhG,EAAI,6BAJrB,IAAI4N,EAAQhO,EACZ,GAAKA,UAA0B,MAAZ2N,EAAK3N,IAAcA,EAAI2N,EAAKhK,QAC/CoK,EAAOrJ,KAAK5B,EAAW6K,EAAK5E,MAAMiF,EAAQ,EAAGhO,MAIrD,OAAOiO,EAAmBF,EAAQtJ,EAAMmF,IAG5C,SAASqE,EAAmBF,EAAQtJ,EAAMmF,GACtC,IAAwC5J,EAApCkO,EAAM1L,EAAQ,GAAI+G,EAAM/G,EAAQ,GACpC,IAAKxC,EAAI+N,EAAOpK,OAAS,EAAG3D,GAAK,EAAGA,IAChCkO,EAAMA,EAAIhK,IAAI6J,EAAO/N,GAAGmJ,MAAMI,IAC9BA,EAAMA,EAAIJ,MAAM1E,GAEpB,OAAOmF,EAAasE,EAAI7H,SAAW6H,EAWvC,SAASC,EAAO3M,EAAGiD,GAEf,IADAA,EAAOzC,EAAOyC,IACLqF,SAAU,CACf,GAAItI,EAAEsI,SAAU,MAAO,CAAE9I,MAAO,CAAC,GAAI4I,YAAY,GACjD,MAAM,IAAIxD,MAAM,6CAEpB,GAAI3B,EAAKkD,QAAQ,GAAI,CACjB,GAAInG,EAAEsI,SAAU,MAAO,CAAE9I,MAAO,CAAC,GAAI4I,YAAY,GACjD,GAAIpI,EAAEoI,aACF,MAAO,CACH5I,MAAO,GAAGyE,OAAO2I,MAAM,GAAIrK,MAAMqK,MAAM,KAAMrK,OAAOvC,EAAE6J,eACjDgD,IAAItK,MAAMpC,UAAU2M,QAAS,CAAC,EAAG,KAEtC1E,YAAY,GAGpB,IAAInG,EAAMM,MAAMqK,MAAM,KAAMrK,MAAMvC,EAAE6J,aAAe,IAC9CgD,IAAItK,MAAMpC,UAAU2M,QAAS,CAAC,EAAG,IAEtC,OADA7K,EAAI0D,QAAQ,CAAC,IACN,CACHnG,MAAO,GAAGyE,OAAO2I,MAAM,GAAI3K,GAC3BmG,YAAY,GAIpB,IAAI2E,GAAM,EAKV,GAJI/M,EAAEoI,cAAgBnF,EAAKuF,eACvBuE,GAAM,EACN/M,EAAIA,EAAE8E,OAEN7B,EAAKiD,SACL,OAAIlG,EAAEsI,SAAiB,CAAE9I,MAAO,CAAC,GAAI4I,YAAY,GAE1C,CACH5I,MAAO+C,MAAMqK,MAAM,KAAMrK,MAAMvC,EAAE6J,eAC5BgD,IAAIG,OAAO7M,UAAU2M,QAAS,GACnC1E,WAAY2E,GAKpB,IAFA,IACclF,EADVoF,EAAM,GACNC,EAAOlN,EACJkN,EAAK9E,cAAgB8E,EAAK9K,WAAWa,IAAS,GAAG,CACpD4E,EAASqF,EAAKrF,OAAO5E,GACrBiK,EAAOrF,EAAOpD,SACd,IAAI0I,EAAQtF,EAAOtD,UACf4I,EAAM/E,eACN+E,EAAQlK,EAAK8D,MAAMoG,GAAOrI,MAC1BoI,EAAOA,EAAKvG,QAEhBsG,EAAI/J,KAAKiK,EAAMtD,cAGnB,OADAoD,EAAI/J,KAAKgK,EAAKrD,cACP,CAAErK,MAAOyN,EAAIrH,UAAWwC,WAAY2E,GAG/C,SAASK,EAAapN,EAAGiD,EAAM9B,GAC3B,IAAIc,EAAM0K,EAAO3M,EAAGiD,GACpB,OAAQhB,EAAImG,WAAa,IAAM,IAAMnG,EAAIzC,MAAMqN,KAAI,SAAUvK,GACzD,OAlER,SAAmB6K,EAAOhM,GAEtB,OAAIgM,GADJhM,EAAWA,GA/sCQ,wCAgtCEgB,OACVhB,EAASgM,GAEb,IAAMA,EAAQ,IA6DVE,CAAU/K,EAAGnB,MACrBmM,KAAK,IAkDZ,SAASC,EAAiBtM,GACtB,GAAIY,GAAWZ,GAAI,CACf,IAAIqB,GAAKrB,EACT,GAAIqB,IAAME,EAASF,GACf,OAAOxB,EAAuB,IAAIc,EAAab,OAAOuB,IAAM,IAAIX,EAAaW,GACjF,MAAM,IAAIsC,MAAM,oBAAsB3D,GAE1C,IAAIO,EAAgB,MAATP,EAAE,GACTO,IAAMP,EAAIA,EAAEsG,MAAM,IACtB,IAAIiG,EAAQvM,EAAEuM,MAAM,MACpB,GAAIA,EAAMrL,OAAS,EAAG,MAAM,IAAIyC,MAAM,oBAAsB4I,EAAMF,KAAK,MACvE,GAAqB,IAAjBE,EAAMrL,OAAc,CACpB,IAAIkG,EAAMmF,EAAM,GAGhB,GAFe,MAAXnF,EAAI,KAAYA,EAAMA,EAAId,MAAM,KACpCc,GAAOA,KACK7F,EAAS6F,KAASxG,EAAUwG,GAAM,MAAM,IAAIzD,MAAM,oBAAsByD,EAAM,6BAC1F,IAAI8D,EAAOqB,EAAM,GACbC,EAAetB,EAAKuB,QAAQ,KAKhC,GAJID,GAAgB,IAChBpF,GAAO8D,EAAKhK,OAASsL,EAAe,EACpCtB,EAAOA,EAAK5E,MAAM,EAAGkG,GAAgBtB,EAAK5E,MAAMkG,EAAe,IAE/DpF,EAAM,EAAG,MAAM,IAAIzD,MAAM,sDAE7B3D,EADAkL,GAAQ,IAAK5J,MAAM8F,EAAM,GAAIiF,KAAK,KAItC,IADc,kBAAkBK,KAAK1M,GACvB,MAAM,IAAI2D,MAAM,oBAAsB3D,GACpD,GAAIH,EACA,OAAO,IAAIc,EAAab,OAAOS,EAAO,IAAMP,EAAIA,IAGpD,IADA,IAAI5B,EAAI,GAAIiI,EAAMrG,EAAEkB,OAAsB2J,EAAMxE,EAr2CrC,EAs2CJA,EAAM,GACTjI,EAAE6D,MAAMjC,EAAEsG,MAAMuE,EAAKxE,KACrBwE,GAx2CO,GAy2CG,IAAGA,EAAM,GACnBxE,GA12CO,EA62CX,OADApF,EAAK7C,GACE,IAAIkC,EAAWlC,EAAGmC,GAc7B,SAASF,EAAWL,GAChB,MAAiB,iBAANA,EAZf,SAA0BA,GACtB,GAAIH,EACA,OAAO,IAAIc,EAAab,OAAOE,IAEnC,GAAIY,EAAUZ,GAAI,CACd,GAAIA,IAAMuB,EAASvB,GAAI,MAAM,IAAI2D,MAAM3D,EAAI,uBAC3C,OAAO,IAAIU,EAAaV,GAE5B,OAAOsM,EAAiBtM,EAAE+G,YAKf4F,CAAiB3M,GAEX,iBAANA,EACAsM,EAAiBtM,GAEX,iBAANA,EACA,IAAIW,EAAaX,GAErBA,EA9GXM,EAAWpB,UAAU0N,QAAU,SAAU3M,GACrC,OAAOyL,EAAOlL,KAAMP,IAGxBS,EAAaxB,UAAU0N,QAAU,SAAU3M,GACvC,OAAOyL,EAAOlL,KAAMP,IAGxBU,EAAazB,UAAU0N,QAAU,SAAU3M,GACvC,OAAOyL,EAAOlL,KAAMP,IAGxBK,EAAWpB,UAAU6H,SAAW,SAAU9G,EAAOC,GAE7C,QAzyCqF,IAwyCjFD,IAAqBA,EAAQ,IACnB,KAAVA,EAAc,OAAOkM,EAAa3L,KAAMP,EAAOC,GAEnD,IADA,IAA2EgM,EAAvElM,EAAIQ,KAAKjC,MAAOf,EAAIwC,EAAEkB,OAAQ2L,EAAMvC,OAAOtK,IAAIxC,MAC1CA,GAAK,GACV0O,EAAQ5B,OAAOtK,EAAExC,IACjBqP,GAH4D,UAG/CvG,MAAM4F,EAAMhL,QAAUgL,EAGvC,OADW1L,KAAKD,KAAO,IAAM,IACfsM,GAGlBnM,EAAaxB,UAAU6H,SAAW,SAAU9G,EAAOC,GAE/C,YArzCqF,IAozCjFD,IAAqBA,EAAQ,IACpB,IAATA,EAAoBkM,EAAa3L,KAAMP,EAAOC,GAC3CoK,OAAO9J,KAAKjC,QAGvBoC,EAAazB,UAAU6H,SAAWrG,EAAaxB,UAAU6H,SAEzDpG,EAAazB,UAAU4N,OAASxM,EAAWpB,UAAU4N,OAASpM,EAAaxB,UAAU4N,OAAS,WAAc,OAAOtM,KAAKuG,YAExHzG,EAAWpB,UAAU2M,QAAU,WAC3B,OAAOkB,SAASvM,KAAKuG,WAAY,KAErCzG,EAAWpB,UAAU0J,WAAatI,EAAWpB,UAAU2M,QAEvDnL,EAAaxB,UAAU2M,QAAU,WAC7B,OAAOrL,KAAKjC,OAEhBmC,EAAaxB,UAAU0J,WAAalI,EAAaxB,UAAU2M,QAC3DlL,EAAazB,UAAU2M,QAAUlL,EAAazB,UAAU0J,WAAa,WACjE,OAAOmE,SAASvM,KAAKuG,WAAY,KAqErC,IAAK,IAAIxJ,EAAI,EAAGA,EAAI,IAAMA,IACtBwC,EAAQxC,GAAK8C,EAAW9C,GACpBA,EAAI,IAAGwC,GAASxC,GAAK8C,GAAY9C,IAiBzC,OAdAwC,EAAQsJ,IAAMtJ,EAAQ,GACtBA,EAAQoJ,KAAOpJ,EAAQ,GACvBA,EAAQiN,SAAWjN,GAAS,GAC5BA,EAAQsG,IAAMA,EACdtG,EAAQ8K,IAAMA,EACd9K,EAAQ+K,IAAMA,EACd/K,EAAQkN,IA1QR,SAAavL,EAAGC,GAGZ,OAFAD,EAAIrB,EAAWqB,GAAGmC,MAClBlC,EAAItB,EAAWsB,GAAGkC,MACXnC,EAAE+D,OAAOqF,EAAIpJ,EAAGC,IAAIqE,SAASrE,IAwQxC5B,EAAQmN,WAAa,SAAU7L,GAAK,OAAOA,aAAaf,GAAce,aAAaX,GAAgBW,aAAaV,GAChHZ,EAAQiJ,YAvQR,SAAqBtH,EAAGC,EAAGoH,GACvBrH,EAAIrB,EAAWqB,GACfC,EAAItB,EAAWsB,GACf,IAAIwL,EAAUpE,GAAOlI,KAAKuM,OACtBC,EAAMxC,EAAInJ,EAAGC,GACb2L,EADwBjH,EAAI3E,EAAGC,GAClBS,SAASiL,GAAK5L,IAAI,GACnC,GAAI6L,EAAM7M,QAAS,OAAO4M,EAAI5L,IAAIZ,KAAKC,MAAMqM,IAAYG,IAGzD,IAFA,IAAIhC,EAASI,EAAO4B,EAAO7N,GAAMlB,MAC7B0F,EAAS,GAAIsJ,GAAa,EACrBhQ,EAAI,EAAGA,EAAI+N,EAAOpK,OAAQ3D,IAAK,CACpC,IAAIiQ,EAAMD,EAAajC,EAAO/N,IAAMA,EAAI,EAAI+N,EAAOpK,OAASoK,EAAO/N,EAAI,GAAKkC,EAAO,GAAKA,EACpFyM,EAAQ3K,EAAS4L,IAAYK,GACjCvJ,EAAOhC,KAAKiK,GACRA,EAAQZ,EAAO/N,KAAIgQ,GAAa,GAExC,OAAOF,EAAI5L,IAAI1B,EAAQ0N,UAAUxJ,EAAQxE,GAAM,KA0PnDM,EAAQ0N,UAAY,SAAUnC,EAAQtJ,EAAMmF,GACxC,OAAOqE,EAAmBF,EAAOM,IAAIvL,GAAaA,EAAW2B,GAAQ,IAAKmF,IAGvEpH,EA/5CkF,GAm6ChFzC,EAAO6B,eAAe,aAC/B7B,EAAOD,QAAUkC,QAQiBC,KAHhCF,EAAgC,WAC9B,OAAOC,GACR9B,KAAKJ,EAASF,EAAqBE,EAASC,MACCA,EAAOD,QAAUiC,KAGxC7B,KAAK+C,KAAMrD,EAAoB,EAApBA,CAAuBG,KAIzD,SAAUA,EAAQD,EAASF;;CAGe,SAAU8N,GAAG,aAAa,IAAIzM,EAAE,CAACyM,EAAEzM,EAAEjB,EAAEwB,KAAK,IAAI2C,EAAE,MAAMuJ,EAAE,EAAE7M,EAAE6M,IAAI,GAAG,MAAM,EAAE5L,EAAE,EAAE,KAAK,IAAI9B,GAAG,CAAC8B,EAAE9B,EAAE,IAAI,IAAIA,EAAEA,GAAG8B,EAAE,GAAGqC,EAAEA,EAAElD,EAAEO,KAAK,EAAEX,EAAEA,EAAEsD,EAAE,UAAUrC,GAAGqC,GAAG,MAAMtD,GAAG,MAAM,OAAOsD,EAAEtD,GAAG,GAAG,GAAG,MAAMb,EAAE,IAAImQ,YAAY,MAAM,IAAIzC,EAAEzM,EAAE,GAAG,IAAI,IAAIjB,EAAE,EAAEA,EAAE,IAAIA,IAAI,CAAC0N,EAAE1N,EAAE,IAAI,IAAIwB,EAAE,EAAEA,EAAE,EAAEA,IAAIkM,EAAE,EAAEA,EAAE,WAAWA,IAAI,EAAEA,IAAI,EAAEzM,EAAEjB,GAAG0N,EAAE,OAAOzM,GAA3G,IAAkH,IAAIO,EAAE,CAACkM,EAAEzM,EAAEO,EAAE2C,KAAK,MAAMtD,EAAEb,EAAE8B,EAAEqC,EAAE3C,EAAEkM,IAAI,EAAE,IAAI,IAAI1N,EAAEmE,EAAEnE,EAAE8B,EAAE9B,IAAI0N,EAAEA,IAAI,EAAE7M,EAAE,KAAK6M,EAAEzM,EAAEjB,KAAK,OAAO,EAAE0N,GAAOvJ,EAAE,SAASuJ,EAAEzM,GAAG,IAAIjB,EAAEwB,EAAE2C,EAAEtD,EAAEiB,EAAEtB,EAAEP,EAAEI,EAAE+P,EAAEC,EAAEjQ,EAAEkQ,EAAEC,EAAEnM,EAAEoM,EAAErQ,EAAEsQ,EAAEC,EAAEjO,EAAEZ,EAAEgH,EAAE/E,EAAE6M,EAAEC,EAAE,MAAMC,EAAEnD,EAAEoD,MAAM9Q,EAAE0N,EAAEqD,QAAQJ,EAAEjD,EAAEsD,MAAMxP,EAAExB,GAAG0N,EAAEuD,SAAS,GAAG9M,EAAEuJ,EAAEwD,SAASN,EAAElD,EAAEyD,OAAOtQ,EAAEsD,GAAGlD,EAAEyM,EAAE0D,WAAWtP,EAAEqC,GAAGuJ,EAAE0D,UAAU,KAAK5Q,EAAEqQ,EAAEQ,KAAKpR,EAAE4Q,EAAES,MAAMjR,EAAEwQ,EAAEU,MAAMnB,EAAES,EAAEW,MAAMnB,EAAEQ,EAAEY,OAAOrR,EAAEyQ,EAAEa,KAAKpB,EAAEO,EAAE5F,KAAKsF,EAAEM,EAAEc,QAAQvN,EAAEyM,EAAEe,SAASpB,GAAG,GAAGK,EAAEgB,SAAS,EAAE1R,GAAG,GAAG0Q,EAAEiB,UAAU,EAAEpE,EAAE,EAAE,CAAC4C,EAAE,KAAKlQ,GAAGuQ,EAAE3Q,MAAMsQ,EAAEA,GAAG,EAAElQ,GAAGuQ,EAAE3Q,MAAMsQ,EAAEA,GAAG,GAAGG,EAAEF,EAAEnQ,EAAEoQ,GAAGvP,EAAE,OAAO,CAAC,GAAGyP,EAAED,IAAI,GAAGrQ,KAAKsQ,EAAEJ,GAAGI,EAAEA,EAAED,IAAI,GAAG,IAAI,IAAIC,EAAEE,EAAEzM,KAAK,MAAMsM,MAAM,CAAC,KAAK,GAAGC,GAAG,CAAC,GAAG,IAAI,GAAGA,GAAG,CAACD,EAAEF,GAAG,MAAME,IAAIrQ,GAAG,GAAGsQ,GAAG,IAAI,SAASzP,EAAE,GAAG,GAAGyP,EAAE,CAACG,EAAE3P,KAAK,GAAG,MAAMwM,EAAEA,EAAEqE,IAAI,8BAA8BlB,EAAE3P,KAAK,GAAG,MAAMwM,EAAEjL,EAAE,MAAMgO,EAAEC,GAAG,GAAGA,IAAIJ,EAAEI,IAAItQ,GAAGuQ,EAAE3Q,MAAMsQ,EAAEA,GAAG,GAAG7N,GAAGrC,GAAG,GAAGsQ,GAAG,EAAEtQ,KAAKsQ,EAAEJ,GAAGI,GAAGJ,EAAE,KAAKlQ,GAAGuQ,EAAE3Q,MAAMsQ,EAAEA,GAAG,EAAElQ,GAAGuQ,EAAE3Q,MAAMsQ,EAAEA,GAAG,GAAGG,EAAErM,EAAEhE,EAAED,GAAGH,EAAE,OAAO,CAAC,GAAG0Q,EAAED,IAAI,GAAGrQ,KAAKsQ,EAAEJ,GAAGI,EAAEA,EAAED,IAAI,GAAG,MAAM,GAAGC,GAAG,CAAC,GAAG,IAAI,GAAGA,GAAG,CAACD,EAAErM,GAAG,MAAMqM,IAAIrQ,GAAG,GAAGsQ,GAAG,IAAI,SAAS1Q,EAAE0N,EAAEqE,IAAI,wBAAwBlB,EAAE3P,KAAK,GAAG,MAAMwM,EAAE,GAAG7L,EAAE,MAAM4O,EAAEC,GAAG,GAAGJ,EAAEI,IAAItQ,GAAGuQ,EAAE3Q,MAAMsQ,EAAEA,GAAG,EAAEA,EAAEI,IAAItQ,GAAGuQ,EAAE3Q,MAAMsQ,EAAEA,GAAG,IAAIzO,GAAGzB,GAAG,GAAGsQ,GAAG,EAAE7O,EAAErB,EAAE,CAACkN,EAAEqE,IAAI,gCAAgClB,EAAE3P,KAAK,GAAG,MAAMwM,EAAE,GAAGtN,KAAKsQ,EAAEJ,GAAGI,EAAEA,EAAEvM,EAAEtD,EAAEgB,EAAE6O,EAAE,CAAC,GAAGA,EAAE7O,EAAE6O,EAAEA,EAAErQ,GAAGwQ,EAAEmB,KAAK,CAACtE,EAAEqE,IAAI,gCAAgClB,EAAE3P,KAAK,GAAG,MAAMwM,EAAE,GAAG7E,EAAE,EAAE/E,EAAEuM,EAAE,IAAID,GAAG,GAAGvH,GAAG5I,EAAEyQ,EAAEA,EAAEjO,EAAE,CAACA,GAAGiO,EAAE,GAAGE,EAAEzM,KAAKkM,EAAExH,aAAa6H,GAAG7H,EAAE1E,EAAEtC,EAAEiC,EAAE8M,QAAQ,GAAGR,EAAEM,GAAG,GAAG7H,GAAG5I,EAAEmQ,EAAEM,EAAEA,GAAGN,EAAEM,EAAEjO,EAAE,CAACA,GAAGiO,EAAE,GAAGE,EAAEzM,KAAKkM,EAAExH,aAAa6H,GAAG,GAAG7H,EAAE,EAAEuH,EAAE3N,EAAE,CAACiO,EAAEN,EAAE3N,GAAGiO,EAAE,GAAGE,EAAEzM,KAAKkM,EAAExH,aAAa6H,GAAG7H,EAAE1E,EAAEtC,EAAEiC,EAAE8M,SAAS,GAAG/H,GAAGuH,EAAEM,EAAEA,EAAEjO,EAAE,CAACA,GAAGiO,EAAE,GAAGE,EAAEzM,KAAKkM,EAAExH,aAAa6H,GAAG7H,EAAE1E,EAAEtC,EAAEiC,EAAE8M,EAAE,KAAKnO,EAAE,GAAGmO,EAAEzM,KAAKL,EAAE+E,KAAK+H,EAAEzM,KAAKL,EAAE+E,KAAK+H,EAAEzM,KAAKL,EAAE+E,KAAKpG,GAAG,EAAEA,IAAImO,EAAEzM,KAAKL,EAAE+E,KAAKpG,EAAE,IAAImO,EAAEzM,KAAKL,EAAE+E,WAAW,CAACA,EAAE1E,EAAEtC,EAAE,GAAG+O,EAAEzM,KAAKyM,EAAE/H,KAAK+H,EAAEzM,KAAKyM,EAAE/H,KAAK+H,EAAEzM,KAAKyM,EAAE/H,KAAKpG,GAAG,QAAQA,EAAE,GAAGA,IAAImO,EAAEzM,KAAKyM,EAAE/H,KAAKpG,EAAE,IAAImO,EAAEzM,KAAKyM,EAAE/H,OAAO,OAAO,aAAa7I,EAAEwB,GAAG2C,EAAErC,GAAGW,EAAE6N,GAAG,EAAEtQ,GAAGyC,EAAE6N,GAAG7N,GAAG,EAAErC,IAAI,GAAGkQ,GAAG,EAAE5C,EAAEqD,QAAQ/Q,EAAE0N,EAAEwD,SAAS/M,EAAEuJ,EAAEuD,SAASjR,EAAEwB,EAAEA,EAAExB,EAAE,EAAE,GAAGA,EAAEwB,GAAGkM,EAAE0D,UAAUjN,EAAErC,EAAEA,EAAEqC,EAAE,IAAI,KAAKA,EAAErC,GAAG+O,EAAEa,KAAKtR,EAAEyQ,EAAE5F,KAAKqF,GAAG,MAAWxO,EAAE,IAAImQ,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,EAAE,IAAIzR,EAAE,IAAI0R,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAKjS,EAAE,IAAIgS,YAAY,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,IAAI,IAAI,IAAI,IAAI,IAAI,IAAI,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,KAAK,MAAM,MAAM,MAAM,EAAE,IAAI5R,EAAE,IAAI6R,WAAW,CAAC,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,GAAG,KAAK,IAAI9B,EAAE,CAAC1C,EAAEzM,EAAEjB,EAAEwB,EAAE2C,EAAEiM,EAAEC,EAAEjQ,KAAK,MAAMkQ,EAAElQ,EAAE6K,KAAK,IAAIsF,EAAEnM,EAAEoM,EAAErQ,EAAEsQ,EAAEC,EAAEjO,EAAE,EAAEZ,EAAE,EAAEgH,EAAE,EAAE/E,EAAE,EAAE6M,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEsB,EAAE,EAAEC,EAAE,EAAEC,EAAE,EAAEC,EAAE,KAAKC,EAAE,EAAE,MAAMC,EAAE,IAAIP,YAAY,IAAIQ,EAAE,IAAIR,YAAY,IAAI,IAAIS,EAAEC,EAAEC,EAAEC,EAAE,KAAKC,EAAE,EAAE,IAAIrQ,EAAE,EAAEA,GAA3pB,GAAgqBA,IAAI+P,EAAE/P,GAAG,EAAE,IAAIZ,EAAE,EAAEA,EAAEL,EAAEK,IAAI2Q,EAAEvR,EAAEjB,EAAE6B,MAAM,IAAI8O,EAAEL,EAAExM,EAA/sB,GAAmtBA,GAAG,GAAG,IAAI0O,EAAE1O,GAAGA,KAAK,GAAG6M,EAAE7M,IAAI6M,EAAE7M,GAAG,IAAIA,EAAE,OAAOK,EAAEiM,KAAK,SAASjM,EAAEiM,KAAK,SAAShQ,EAAE6K,KAAK,EAAE,EAAE,IAAIpC,EAAE,EAAEA,EAAE/E,GAAG,IAAI0O,EAAE3J,GAAGA,KAAK,IAAI8H,EAAE9H,IAAI8H,EAAE9H,GAAGsJ,EAAE,EAAE1P,EAAE,EAAEA,GAA/1B,GAAo2BA,IAAI,GAAG0P,IAAI,EAAEA,GAAGK,EAAE/P,GAAG0P,EAAE,EAAE,OAAO,EAAE,GAAGA,EAAE,IAAI,IAAIzE,GAAG,IAAI5J,GAAG,OAAO,EAAE,IAAI2O,EAAE,GAAG,EAAEhQ,EAAE,EAAEA,EAAr7B,GAAy7BA,IAAIgQ,EAAEhQ,EAAE,GAAGgQ,EAAEhQ,GAAG+P,EAAE/P,GAAG,IAAIZ,EAAE,EAAEA,EAAEL,EAAEK,IAAI,IAAIZ,EAAEjB,EAAE6B,KAAKwO,EAAEoC,EAAExR,EAAEjB,EAAE6B,OAAOA,GAAG,GAAG,IAAI6L,GAAG4E,EAAEO,EAAExC,EAAEK,EAAE,IAAI,IAAIhD,GAAG4E,EAAExQ,EAAEyQ,GAAG,IAAIM,EAAErS,EAAEsS,GAAG,IAAIpC,EAAE,MAAM4B,EAAErS,EAAE4S,EAAExS,EAAEqQ,GAAG,GAAG2B,EAAE,EAAExQ,EAAE,EAAEY,EAAEoG,EAAE4H,EAAEL,EAAEQ,EAAED,EAAEE,EAAE,EAAEL,GAAG,EAAE4B,EAAE,GAAGzB,EAAExQ,EAAEiS,EAAE,EAAE,IAAI1E,GAAG0E,EAAE,KAAK,IAAI1E,GAAG0E,EAAE,IAAI,OAAO,EAAE,OAAO,CAACM,EAAEjQ,EAAEoO,EAAER,EAAExO,GAAG6O,GAAGiC,EAAE,EAAEC,EAAEvC,EAAExO,IAAIwO,EAAExO,GAAG6O,GAAGiC,EAAEE,EAAEC,EAAEzC,EAAExO,IAAI+Q,EAAEN,EAAEC,EAAElC,EAAExO,MAAM8Q,EAAE,GAAGC,EAAE,GAAGrC,EAAE,GAAG9N,EAAEoO,EAAEzM,EAAE,GAAGwM,EAAE/H,EAAEzE,EAAE,GAAGA,GAAGmM,EAAEpM,EAAEsM,GAAG4B,GAAGxB,GAAGzM,GAAGsO,GAAG,GAAGC,GAAG,GAAGC,EAAE,QAAQ,IAAIxO,GAAG,IAAImM,EAAE,GAAG9N,EAAE,EAAE4P,EAAE9B,GAAGA,IAAI,EAAE,GAAG,IAAIA,GAAG8B,GAAG9B,EAAE,EAAE8B,GAAG9B,GAAG8B,EAAE,EAAExQ,IAAI,KAAK2Q,EAAE/P,GAAG,CAAC,GAAGA,IAAIqB,EAAE,MAAMrB,EAAExB,EAAEjB,EAAEqQ,EAAExO,IAAI,GAAGY,EAAEkO,IAAI0B,EAAElS,KAAKqQ,EAAE,CAAC,IAAI,IAAIK,IAAIA,EAAEF,GAAGF,GAAG5H,EAAE+H,EAAEnO,EAAEoO,EAAEsB,EAAE,GAAGvB,EAAEA,EAAEC,EAAE/M,IAAIqO,GAAGK,EAAE5B,EAAEC,KAAKsB,GAAG,KAAKvB,IAAIuB,IAAI,EAAE,GAAGC,GAAG,GAAGxB,EAAE,IAAIlD,GAAG0E,EAAE,KAAK,IAAI1E,GAAG0E,EAAE,IAAI,OAAO,EAAE5B,EAAE6B,EAAElS,EAAEgE,EAAEqM,GAAGG,GAAG,GAAGC,GAAG,GAAGH,EAAEL,EAAE,GAAG,OAAO,IAAIiC,IAAIlO,EAAEsM,EAAE4B,GAAG5P,EAAEoO,GAAG,GAAG,IAAI,GAAG,GAAGzQ,EAAE6K,KAAK0F,EAAE,GAAGN,EAAE,CAAC0C,WAAW,EAAEC,gBAAgB,EAAEC,aAAa,EAAEC,aAAa,EAAEC,SAAS,EAAEC,QAAQ,EAAEC,QAAQ,EAAEC,KAAK,EAAEC,aAAa,EAAEC,YAAY,EAAEC,SAAS,EAAEC,gBAAgB,EAAEC,cAAc,EAAEC,aAAa,EAAEC,aAAa,EAAEC,iBAAiB,EAAEC,aAAa,EAAEC,mBAAmB,EAAEC,uBAAuB,EAAEC,WAAW,EAAEC,eAAe,EAAEC,MAAM,EAAEC,QAAQ,EAAEC,mBAAmB,EAAEC,SAAS,EAAEC,OAAO,EAAEC,UAAU,EAAEC,WAAW,GAAG,MAAMvB,SAAS/S,EAAEgT,QAAQ9C,EAAE+C,QAAQ9C,EAAE+C,KAAKlP,EAAEmP,aAAa/C,EAAEgD,YAAYrT,EAAEuT,eAAejD,EAAEkD,aAAajD,EAAEkD,YAAYnR,EAAEoR,YAAYhS,EAAE6S,WAAW7L,GAAGwH,EAAEvM,EAAE,GAAG6M,EAAE,GAAGC,EAAElD,IAAIA,IAAI,GAAG,MAAMA,IAAI,EAAE,SAAS,MAAMA,IAAI,KAAK,IAAIA,IAAI,IAAI,SAASmD,IAAI5N,KAAK/B,KAAK,EAAE+B,KAAK0R,MAAK,EAAG1R,KAAK2R,KAAK,EAAE3R,KAAK4R,UAAS,EAAG5R,KAAK6R,MAAM,EAAE7R,KAAKoO,KAAK,EAAEpO,KAAKgE,MAAM,EAAEhE,KAAK8R,MAAM,EAAE9R,KAAK+R,KAAK,KAAK/R,KAAKgS,MAAM,EAAEhS,KAAKqO,MAAM,EAAErO,KAAKsO,MAAM,EAAEtO,KAAKuO,MAAM,EAAEvO,KAAKwO,OAAO,KAAKxO,KAAKyO,KAAK,EAAEzO,KAAKgI,KAAK,EAAEhI,KAAKU,OAAO,EAAEV,KAAKiS,OAAO,EAAEjS,KAAKkS,MAAM,EAAElS,KAAK0O,QAAQ,KAAK1O,KAAK2O,SAAS,KAAK3O,KAAK4O,QAAQ,EAAE5O,KAAK6O,SAAS,EAAE7O,KAAKmS,MAAM,EAAEnS,KAAKoS,KAAK,EAAEpS,KAAKqS,MAAM,EAAErS,KAAKsS,KAAK,EAAEtS,KAAKkF,KAAK,KAAKlF,KAAKuS,KAAK,IAAIvD,YAAY,KAAKhP,KAAKwS,KAAK,IAAIxD,YAAY,KAAKhP,KAAKyS,OAAO,KAAKzS,KAAK0S,QAAQ,KAAK1S,KAAK+O,KAAK,EAAE/O,KAAK2S,KAAK,EAAE3S,KAAK4S,IAAI,EAAE,MAAM1D,EAAEzE,IAAI,IAAIA,IAAIA,EAAEoD,MAAM,OAAOL,EAAE,MAAMxP,EAAEyM,EAAEoD,MAAM,OAAOpD,EAAEoI,SAASpI,EAAEqI,UAAU9U,EAAE8T,MAAM,EAAErH,EAAEqE,IAAI,GAAG9Q,EAAE2T,OAAOlH,EAAEsI,MAAM,EAAE/U,EAAE2T,MAAM3T,EAAEC,KAAK,EAAED,EAAE0T,KAAK,EAAE1T,EAAE4T,SAAS,EAAE5T,EAAEoQ,KAAK,MAAMpQ,EAAE+T,KAAK,KAAK/T,EAAEyQ,KAAK,EAAEzQ,EAAEgK,KAAK,EAAEhK,EAAE0Q,QAAQ1Q,EAAEyU,OAAO,IAAIO,WAAW,KAAKhV,EAAE2Q,SAAS3Q,EAAE0U,QAAQ,IAAIM,WAAW,KAAKhV,EAAE+Q,KAAK,EAAE/Q,EAAE2U,MAAM,EAAExR,GAAGgO,EAAE1E,IAAI,IAAIA,IAAIA,EAAEoD,MAAM,OAAOL,EAAE,MAAMxP,EAAEyM,EAAEoD,MAAM,OAAO7P,EAAEqQ,MAAM,EAAErQ,EAAEsQ,MAAM,EAAEtQ,EAAEuQ,MAAM,EAAEW,EAAEzE,IAAI2E,EAAE,CAAC3E,EAAEzM,KAAK,IAAIjB,EAAE,IAAI0N,IAAIA,EAAEoD,MAAM,OAAOL,EAAE,MAAMjP,EAAEkM,EAAEoD,MAAM,OAAO7P,EAAE,GAAGjB,EAAE,EAAEiB,GAAGA,IAAIjB,EAAE,GAAGiB,GAAG,GAAGA,EAAE,KAAKA,GAAG,KAAKA,IAAIA,EAAE,GAAGA,EAAE,IAAIwP,GAAG,OAAOjP,EAAEiQ,QAAQjQ,EAAEyT,QAAQhU,IAAIO,EAAEiQ,OAAO,MAAMjQ,EAAEoT,KAAK5U,EAAEwB,EAAEyT,MAAMhU,EAAEmR,EAAE1E,KAAK4E,EAAE,CAAC5E,EAAEzM,KAAK,IAAIyM,EAAE,OAAO+C,EAAE,MAAMzQ,EAAE,IAAI6Q,EAAEnD,EAAEoD,MAAM9Q,EAAEA,EAAEyR,OAAO,KAAK,MAAMjQ,EAAE6Q,EAAE3E,EAAEzM,GAAG,OAAOO,IAAI4C,IAAIsJ,EAAEoD,MAAM,MAAMtP,GAAG,IAAI+Q,EAAEC,EAAEC,GAAE,EAAG,MAAMC,EAAEhF,IAAI,GAAG+E,EAAE,CAACF,EAAE,IAAI0D,WAAW,KAAKzD,EAAE,IAAIyD,WAAW,IAAI,IAAIhV,EAAE,EAAE,KAAKA,EAAE,KAAKyM,EAAE8H,KAAKvU,KAAK,EAAE,KAAKA,EAAE,KAAKyM,EAAE8H,KAAKvU,KAAK,EAAE,KAAKA,EAAE,KAAKyM,EAAE8H,KAAKvU,KAAK,EAAE,KAAKA,EAAE,KAAKyM,EAAE8H,KAAKvU,KAAK,EAAE,IAAImP,EAAE,EAAE1C,EAAE8H,KAAK,EAAE,IAAIjD,EAAE,EAAE7E,EAAE+H,KAAK,CAACxK,KAAK,IAAIhK,EAAE,EAAEA,EAAE,IAAIyM,EAAE8H,KAAKvU,KAAK,EAAEmP,EAAE,EAAE1C,EAAE8H,KAAK,EAAE,GAAGhD,EAAE,EAAE9E,EAAE+H,KAAK,CAACxK,KAAK,IAAIwH,GAAE,EAAG/E,EAAEiE,QAAQY,EAAE7E,EAAEmE,QAAQ,EAAEnE,EAAEkE,SAASY,EAAE9E,EAAEoE,SAAS,GAAGa,EAAE,CAACjF,EAAEzM,EAAEjB,EAAEwB,KAAK,IAAI2C,EAAE,MAAMtD,EAAE6M,EAAEoD,MAAM,OAAO,OAAOjQ,EAAE4Q,SAAS5Q,EAAEyQ,MAAM,GAAGzQ,EAAEoU,MAAMpU,EAAE2Q,MAAM,EAAE3Q,EAAE0Q,MAAM,EAAE1Q,EAAE4Q,OAAO,IAAIS,WAAWrR,EAAEyQ,QAAQ9P,GAAGX,EAAEyQ,OAAOzQ,EAAE4Q,OAAOyE,IAAIjV,EAAEkV,SAASnW,EAAEa,EAAEyQ,MAAMtR,GAAG,GAAGa,EAAE2Q,MAAM,EAAE3Q,EAAE0Q,MAAM1Q,EAAEyQ,QAAQnN,EAAEtD,EAAEyQ,MAAMzQ,EAAE2Q,MAAMrN,EAAE3C,IAAI2C,EAAE3C,GAAGX,EAAE4Q,OAAOyE,IAAIjV,EAAEkV,SAASnW,EAAEwB,EAAExB,EAAEwB,EAAE2C,GAAGtD,EAAE2Q,QAAQhQ,GAAG2C,IAAItD,EAAE4Q,OAAOyE,IAAIjV,EAAEkV,SAASnW,EAAEwB,EAAExB,GAAG,GAAGa,EAAE2Q,MAAMhQ,EAAEX,EAAE0Q,MAAM1Q,EAAEyQ,QAAQzQ,EAAE2Q,OAAOrN,EAAEtD,EAAE2Q,QAAQ3Q,EAAEyQ,QAAQzQ,EAAE2Q,MAAM,GAAG3Q,EAAE0Q,MAAM1Q,EAAEyQ,QAAQzQ,EAAE0Q,OAAOpN,KAAK,GAAG,IAAIyO,EAAgBR,EAAhBQ,EAAyFN,EAAzFM,EAAmG,CAAClF,EAAE1N,KAAK,IAAIa,EAAEiB,EAAEtB,EAAEP,EAAEI,EAAEgQ,EAAEQ,EAAEsB,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEC,EAAEG,EAAEC,EAAEC,EAAEsD,EAAEC,EAAEC,EAAEhR,EAAEiR,EAAEC,EAAE,EAAE,MAAMC,EAAE,IAAIvE,WAAW,GAAG,IAAIwE,EAAEC,EAAE,MAAMC,EAAE,IAAI1E,WAAW,CAAC,GAAG,GAAG,GAAG,EAAE,EAAE,EAAE,EAAE,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,GAAG,EAAE,KAAK,IAAIxE,IAAIA,EAAEoD,QAAQpD,EAAEyD,SAASzD,EAAEsD,OAAO,IAAItD,EAAEuD,SAAS,OAAOR,EAAE5P,EAAE6M,EAAEoD,MAAMjQ,EAAEK,OAAO4C,IAAIjD,EAAEK,KAAK,IAAIb,EAAEqN,EAAEwD,SAAS1Q,EAAEkN,EAAEyD,OAAON,EAAEnD,EAAE0D,UAAUnR,EAAEyN,EAAEqD,QAAQjP,EAAE4L,EAAEsD,MAAMX,EAAE3C,EAAEuD,SAASkB,EAAEtR,EAAE6Q,KAAKU,EAAEvR,EAAEoK,KAAKoH,EAAEhC,EAAEiC,EAAEzB,EAAE0F,EAAEnS,EAAEsJ,EAAE,OAAO,OAAO7M,EAAEK,MAAM,KAAK,EAAE,GAAG,IAAIL,EAAE+T,KAAK,CAAC/T,EAAEK,KAAK,GAAG,MAAM,KAAKkR,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAG,EAAEvR,EAAE+T,MAAM,QAAQzC,EAAE,CAACtR,EAAEoG,MAAM,EAAEwP,EAAE,GAAG,IAAItE,EAAEsE,EAAE,GAAGtE,IAAI,EAAE,IAAItR,EAAEoG,MAAMzF,EAAEX,EAAEoG,MAAMwP,EAAE,EAAE,GAAGtE,EAAE,EAAEC,EAAE,EAAEvR,EAAEK,KAAK,EAAE,MAAM,GAAGL,EAAEiU,MAAM,EAAEjU,EAAEmU,OAAOnU,EAAEmU,KAAK6B,MAAK,KAAM,EAAEhW,EAAE+T,UAAU,IAAIzC,IAAI,IAAIA,GAAG,IAAI,GAAG,CAACzE,EAAEqE,IAAI,yBAAyBlR,EAAEK,KAAKyP,EAAE,MAAM,IAAI,GAAGwB,KAAKtJ,EAAE,CAAC6E,EAAEqE,IAAI,6BAA6BlR,EAAEK,KAAKyP,EAAE,MAAM,GAAGwB,KAAK,EAAEC,GAAG,EAAE9M,EAAE,GAAG,GAAG6M,GAAG,IAAItR,EAAEoU,MAAMpU,EAAEoU,MAAM3P,OAAO,GAAGA,EAAEzE,EAAEoU,MAAM,CAACvH,EAAEqE,IAAI,sBAAsBlR,EAAEK,KAAKyP,EAAE,MAAM9P,EAAEwQ,KAAK,GAAGxQ,EAAEoU,MAAMvH,EAAEsI,MAAMnV,EAAEoG,MAAM,EAAEpG,EAAEK,KAAK,IAAIiR,EAAE,GAAGrO,EAAEqO,EAAE,EAAEC,EAAE,EAAE,MAAM,KAAK,EAAE,KAAKA,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAGvR,EAAEiU,MAAM3C,GAAG,IAAItR,EAAEiU,SAASjM,EAAE,CAAC6E,EAAEqE,IAAI,6BAA6BlR,EAAEK,KAAKyP,EAAE,MAAM,GAAG,MAAM9P,EAAEiU,MAAM,CAACpH,EAAEqE,IAAI,2BAA2BlR,EAAEK,KAAKyP,EAAE,MAAM9P,EAAEmU,OAAOnU,EAAEmU,KAAKrH,KAAKwE,GAAG,EAAE,GAAG,IAAItR,EAAEiU,QAAQ2B,EAAE,GAAG,IAAItE,EAAEsE,EAAE,GAAGtE,IAAI,EAAE,IAAItR,EAAEoG,MAAMzF,EAAEX,EAAEoG,MAAMwP,EAAE,EAAE,IAAItE,EAAE,EAAEC,EAAE,EAAEvR,EAAEK,KAAK,EAAE,KAAK,EAAE,KAAKkR,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAEvR,EAAEmU,OAAOnU,EAAEmU,KAAK8B,KAAK3E,GAAG,IAAItR,EAAEiU,QAAQ2B,EAAE,GAAG,IAAItE,EAAEsE,EAAE,GAAGtE,IAAI,EAAE,IAAIsE,EAAE,GAAGtE,IAAI,GAAG,IAAIsE,EAAE,GAAGtE,IAAI,GAAG,IAAItR,EAAEoG,MAAMzF,EAAEX,EAAEoG,MAAMwP,EAAE,EAAE,IAAItE,EAAE,EAAEC,EAAE,EAAEvR,EAAEK,KAAK,EAAE,KAAK,EAAE,KAAKkR,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAEvR,EAAEmU,OAAOnU,EAAEmU,KAAK+B,OAAO,IAAI5E,EAAEtR,EAAEmU,KAAKgC,GAAG7E,GAAG,GAAG,IAAItR,EAAEiU,QAAQ2B,EAAE,GAAG,IAAItE,EAAEsE,EAAE,GAAGtE,IAAI,EAAE,IAAItR,EAAEoG,MAAMzF,EAAEX,EAAEoG,MAAMwP,EAAE,EAAE,IAAItE,EAAE,EAAEC,EAAE,EAAEvR,EAAEK,KAAK,EAAE,KAAK,EAAE,GAAG,KAAKL,EAAEiU,MAAM,CAAC,KAAK1C,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAEvR,EAAE8C,OAAOwO,EAAEtR,EAAEmU,OAAOnU,EAAEmU,KAAKiC,UAAU9E,GAAG,IAAItR,EAAEiU,QAAQ2B,EAAE,GAAG,IAAItE,EAAEsE,EAAE,GAAGtE,IAAI,EAAE,IAAItR,EAAEoG,MAAMzF,EAAEX,EAAEoG,MAAMwP,EAAE,EAAE,IAAItE,EAAE,EAAEC,EAAE,OAAOvR,EAAEmU,OAAOnU,EAAEmU,KAAKG,MAAM,MAAMtU,EAAEK,KAAK,EAAE,KAAK,EAAE,GAAG,KAAKL,EAAEiU,QAAQvC,EAAE1R,EAAE8C,OAAO4O,EAAElC,IAAIkC,EAAElC,GAAGkC,IAAI1R,EAAEmU,OAAO1P,EAAEzE,EAAEmU,KAAKiC,UAAUpW,EAAE8C,OAAO9C,EAAEmU,KAAKG,QAAQtU,EAAEmU,KAAKG,MAAM,IAAIjD,WAAWrR,EAAEmU,KAAKiC,YAAYpW,EAAEmU,KAAKG,MAAMe,IAAIpU,EAAEqU,SAASlW,EAAEA,EAAEsS,GAAGjN,IAAI,IAAIzE,EAAEiU,QAAQjU,EAAEoG,MAAMzF,EAAEX,EAAEoG,MAAMnF,EAAEyQ,EAAEtS,IAAIoQ,GAAGkC,EAAEtS,GAAGsS,EAAE1R,EAAE8C,QAAQ4O,GAAG1R,EAAE8C,QAAQ,MAAM+J,EAAE7M,EAAE8C,OAAO,EAAE9C,EAAEK,KAAK,EAAE,KAAK,EAAE,GAAG,KAAKL,EAAEiU,MAAM,CAAC,GAAG,IAAIzE,EAAE,MAAM3C,EAAE6E,EAAE,EAAE,GAAGjN,EAAExD,EAAE7B,EAAEsS,KAAK1R,EAAEmU,MAAM1P,GAAGzE,EAAE8C,OAAO,QAAQ9C,EAAEmU,KAAK1U,MAAMyM,OAAOmK,aAAa5R,UAAUA,GAAGiN,EAAElC,GAAG,GAAG,IAAIxP,EAAEiU,QAAQjU,EAAEoG,MAAMzF,EAAEX,EAAEoG,MAAMnF,EAAEyQ,EAAEtS,IAAIoQ,GAAGkC,EAAEtS,GAAGsS,EAAEjN,EAAE,MAAMoI,OAAO7M,EAAEmU,OAAOnU,EAAEmU,KAAK1U,KAAK,MAAMO,EAAE8C,OAAO,EAAE9C,EAAEK,KAAK,EAAE,KAAK,EAAE,GAAG,KAAKL,EAAEiU,MAAM,CAAC,GAAG,IAAIzE,EAAE,MAAM3C,EAAE6E,EAAE,EAAE,GAAGjN,EAAExD,EAAE7B,EAAEsS,KAAK1R,EAAEmU,MAAM1P,GAAGzE,EAAE8C,OAAO,QAAQ9C,EAAEmU,KAAKmC,SAASpK,OAAOmK,aAAa5R,UAAUA,GAAGiN,EAAElC,GAAG,GAAG,IAAIxP,EAAEiU,QAAQjU,EAAEoG,MAAMzF,EAAEX,EAAEoG,MAAMnF,EAAEyQ,EAAEtS,IAAIoQ,GAAGkC,EAAEtS,GAAGsS,EAAEjN,EAAE,MAAMoI,OAAO7M,EAAEmU,OAAOnU,EAAEmU,KAAKmC,QAAQ,MAAMtW,EAAEK,KAAK,EAAE,KAAK,EAAE,GAAG,IAAIL,EAAEiU,MAAM,CAAC,KAAK1C,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAGD,KAAK,MAAMtR,EAAEoG,OAAO,CAACyG,EAAEqE,IAAI,sBAAsBlR,EAAEK,KAAKyP,EAAE,MAAMwB,EAAE,EAAEC,EAAE,EAAEvR,EAAEmU,OAAOnU,EAAEmU,KAAKoC,KAAKvW,EAAEiU,OAAO,EAAE,EAAEjU,EAAEmU,KAAK6B,MAAK,GAAInJ,EAAEsI,MAAMnV,EAAEoG,MAAM,EAAEpG,EAAEK,KAAK4C,EAAE,MAAM,KAAK,GAAG,KAAKsO,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE1E,EAAEsI,MAAMnV,EAAEoG,MAAM2J,EAAEuB,GAAGA,EAAE,EAAEC,EAAE,EAAEvR,EAAEK,KAAK,GAAG,KAAK,GAAG,GAAG,IAAIL,EAAEgU,SAAS,OAAOnH,EAAEwD,SAAS7Q,EAAEqN,EAAE0D,UAAUP,EAAEnD,EAAEqD,QAAQ9Q,EAAEyN,EAAEuD,SAASZ,EAAExP,EAAE6Q,KAAKS,EAAEtR,EAAEoK,KAAKmH,EAAEjS,EAAEuN,EAAEsI,MAAMnV,EAAEoG,MAAM,EAAEpG,EAAEK,KAAK4C,EAAE,KAAKA,EAAE,GAAG9D,IAAIsQ,GAAGtQ,IAAIuQ,EAAE,MAAM7C,EAAE,KAAK,GAAG,GAAG7M,EAAE8T,KAAK,CAACxC,KAAK,EAAEC,EAAEA,GAAG,EAAEA,EAAEvR,EAAEK,KAAK,GAAG,MAAM,KAAKkR,EAAE,GAAG,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,OAAOvR,EAAE8T,KAAK,EAAExC,EAAEA,KAAK,EAAEC,GAAG,EAAE,EAAED,GAAG,KAAK,EAAEtR,EAAEK,KAAK,GAAG,MAAM,KAAK,EAAE,GAAGwR,EAAE7R,GAAGA,EAAEK,KAAK,GAAGlB,IAAIuQ,EAAE,CAAC4B,KAAK,EAAEC,GAAG,EAAE,MAAM1E,EAAE,MAAM,KAAK,EAAE7M,EAAEK,KAAK,GAAG,MAAM,KAAK,EAAEwM,EAAEqE,IAAI,qBAAqBlR,EAAEK,KAAKyP,EAAEwB,KAAK,EAAEC,GAAG,EAAE,MAAM,KAAK,GAAG,IAAID,KAAK,EAAEC,EAAEA,GAAG,EAAEA,EAAEA,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,IAAI,MAAMD,KAAKA,IAAI,GAAG,OAAO,CAACzE,EAAEqE,IAAI,+BAA+BlR,EAAEK,KAAKyP,EAAE,MAAM,GAAG9P,EAAE8C,OAAO,MAAMwO,EAAEA,EAAE,EAAEC,EAAE,EAAEvR,EAAEK,KAAK,GAAGlB,IAAIuQ,EAAE,MAAM7C,EAAE,KAAK,GAAG7M,EAAEK,KAAK,GAAG,KAAK,GAAG,GAAGqR,EAAE1R,EAAE8C,OAAO4O,EAAE,CAAC,GAAGA,EAAElC,IAAIkC,EAAElC,GAAGkC,EAAE1B,IAAI0B,EAAE1B,GAAG,IAAI0B,EAAE,MAAM7E,EAAElN,EAAE0V,IAAIpU,EAAEqU,SAASlW,EAAEA,EAAEsS,GAAGlS,GAAGgQ,GAAGkC,EAAEtS,GAAGsS,EAAE1B,GAAG0B,EAAElS,GAAGkS,EAAE1R,EAAE8C,QAAQ4O,EAAE,MAAM1R,EAAEK,KAAK4C,EAAE,MAAM,KAAK,GAAG,KAAKsO,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAGvR,EAAEwU,KAAK,KAAK,GAAGlD,GAAGA,KAAK,EAAEC,GAAG,EAAEvR,EAAEyU,MAAM,GAAG,GAAGnD,GAAGA,KAAK,EAAEC,GAAG,EAAEvR,EAAEuU,MAAM,GAAG,GAAGjD,GAAGA,KAAK,EAAEC,GAAG,EAAEvR,EAAEwU,KAAK,KAAKxU,EAAEyU,MAAM,GAAG,CAAC5H,EAAEqE,IAAI,sCAAsClR,EAAEK,KAAKyP,EAAE,MAAM9P,EAAE0U,KAAK,EAAE1U,EAAEK,KAAK,GAAG,KAAK,GAAG,KAAKL,EAAE0U,KAAK1U,EAAEuU,OAAO,CAAC,KAAKhD,EAAE,GAAG,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAEvR,EAAE2U,KAAKoB,EAAE/V,EAAE0U,SAAS,EAAEpD,EAAEA,KAAK,EAAEC,GAAG,EAAE,KAAKvR,EAAE0U,KAAK,IAAI1U,EAAE2U,KAAKoB,EAAE/V,EAAE0U,SAAS,EAAE,GAAG1U,EAAE8Q,QAAQ9Q,EAAE6U,OAAO7U,EAAEgR,QAAQ,EAAE6E,EAAE,CAACzL,KAAKpK,EAAEgR,SAAS0E,EAAEnG,EAAE,EAAEvP,EAAE2U,KAAK,EAAE,GAAG3U,EAAE8Q,QAAQ,EAAE9Q,EAAE4U,KAAKiB,GAAG7V,EAAEgR,QAAQ6E,EAAEzL,KAAKsL,EAAE,CAAC7I,EAAEqE,IAAI,2BAA2BlR,EAAEK,KAAKyP,EAAE,MAAM9P,EAAE0U,KAAK,EAAE1U,EAAEK,KAAK,GAAG,KAAK,GAAG,KAAKL,EAAE0U,KAAK1U,EAAEwU,KAAKxU,EAAEyU,OAAO,CAAC,KAAKkB,EAAE3V,EAAE8Q,QAAQQ,GAAG,GAAGtR,EAAEgR,SAAS,GAAGe,EAAE4D,IAAI,GAAG3D,EAAE2D,IAAI,GAAG,IAAI1D,EAAE,MAAM0D,IAAI5D,GAAGR,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAGU,EAAE,GAAGX,KAAKS,EAAER,GAAGQ,EAAE/R,EAAE2U,KAAK3U,EAAE0U,QAAQzC,MAAM,CAAC,GAAG,KAAKA,EAAE,CAAC,IAAI6D,EAAE/D,EAAE,EAAER,EAAEuE,GAAG,CAAC,GAAG,IAAItG,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAGD,KAAKS,EAAER,GAAGQ,EAAE,IAAI/R,EAAE0U,KAAK,CAAC7H,EAAEqE,IAAI,4BAA4BlR,EAAEK,KAAKyP,EAAE,MAAMrL,EAAEzE,EAAE2U,KAAK3U,EAAE0U,KAAK,GAAGhD,EAAE,GAAG,EAAEJ,GAAGA,KAAK,EAAEC,GAAG,OAAO,GAAG,KAAKU,EAAE,CAAC,IAAI6D,EAAE/D,EAAE,EAAER,EAAEuE,GAAG,CAAC,GAAG,IAAItG,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAED,KAAKS,EAAER,GAAGQ,EAAEtN,EAAE,EAAEiN,EAAE,GAAG,EAAEJ,GAAGA,KAAK,EAAEC,GAAG,MAAM,CAAC,IAAIuE,EAAE/D,EAAE,EAAER,EAAEuE,GAAG,CAAC,GAAG,IAAItG,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAED,KAAKS,EAAER,GAAGQ,EAAEtN,EAAE,EAAEiN,EAAE,IAAI,IAAIJ,GAAGA,KAAK,EAAEC,GAAG,EAAE,GAAGvR,EAAE0U,KAAKhD,EAAE1R,EAAEwU,KAAKxU,EAAEyU,MAAM,CAAC5H,EAAEqE,IAAI,4BAA4BlR,EAAEK,KAAKyP,EAAE,MAAM,KAAK4B,KAAK1R,EAAE2U,KAAK3U,EAAE0U,QAAQjQ,GAAG,GAAGzE,EAAEK,OAAOyP,EAAE,MAAM,GAAG,IAAI9P,EAAE2U,KAAK,KAAK,CAAC9H,EAAEqE,IAAI,uCAAuClR,EAAEK,KAAKyP,EAAE,MAAM,GAAG9P,EAAEgR,QAAQ,EAAE6E,EAAE,CAACzL,KAAKpK,EAAEgR,SAAS0E,EAAEnG,EAAE,EAAEvP,EAAE2U,KAAK,EAAE3U,EAAEwU,KAAKxU,EAAE8Q,QAAQ,EAAE9Q,EAAE4U,KAAKiB,GAAG7V,EAAEgR,QAAQ6E,EAAEzL,KAAKsL,EAAE,CAAC7I,EAAEqE,IAAI,8BAA8BlR,EAAEK,KAAKyP,EAAE,MAAM,GAAG9P,EAAEiR,SAAS,EAAEjR,EAAE+Q,SAAS/Q,EAAE8U,QAAQe,EAAE,CAACzL,KAAKpK,EAAEiR,UAAUyE,EAAEnG,EAAE,EAAEvP,EAAE2U,KAAK3U,EAAEwU,KAAKxU,EAAEyU,MAAMzU,EAAE+Q,SAAS,EAAE/Q,EAAE4U,KAAKiB,GAAG7V,EAAEiR,SAAS4E,EAAEzL,KAAKsL,EAAE,CAAC7I,EAAEqE,IAAI,wBAAwBlR,EAAEK,KAAKyP,EAAE,MAAM,GAAG9P,EAAEK,KAAK,GAAGlB,IAAIuQ,EAAE,MAAM7C,EAAE,KAAK,GAAG7M,EAAEK,KAAK,GAAG,KAAK,GAAG,GAAGmP,GAAG,GAAGQ,GAAG,IAAI,CAACnD,EAAEwD,SAAS7Q,EAAEqN,EAAE0D,UAAUP,EAAEnD,EAAEqD,QAAQ9Q,EAAEyN,EAAEuD,SAASZ,EAAExP,EAAE6Q,KAAKS,EAAEtR,EAAEoK,KAAKmH,EAAEjO,EAAEuJ,EAAE4E,GAAGjS,EAAEqN,EAAEwD,SAAS1Q,EAAEkN,EAAEyD,OAAON,EAAEnD,EAAE0D,UAAUnR,EAAEyN,EAAEqD,QAAQjP,EAAE4L,EAAEsD,MAAMX,EAAE3C,EAAEuD,SAASkB,EAAEtR,EAAE6Q,KAAKU,EAAEvR,EAAEoK,KAAKpK,EAAEK,OAAO4C,IAAIjD,EAAE+U,MAAM,GAAG,MAAM,IAAI/U,EAAE+U,KAAK,EAAEY,EAAE3V,EAAE8Q,QAAQQ,GAAG,GAAGtR,EAAEgR,SAAS,GAAGe,EAAE4D,IAAI,GAAG3D,EAAE2D,IAAI,GAAG,IAAI1D,EAAE,MAAM0D,IAAI5D,GAAGR,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAGS,GAAG,IAAI,IAAIA,GAAG,CAAC,IAAIuD,EAAExD,EAAEyD,EAAExD,EAAEyD,EAAExD,EAAE0D,EAAE3V,EAAE8Q,QAAQ2E,IAAInE,GAAG,GAAGiE,EAAEC,GAAG,IAAID,IAAIxD,EAAE4D,IAAI,GAAG3D,EAAE2D,IAAI,GAAG,IAAI1D,EAAE,MAAM0D,IAAIJ,EAAExD,GAAGR,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAED,KAAKiE,EAAEhE,GAAGgE,EAAEvV,EAAE+U,MAAMQ,EAAE,GAAGjE,KAAKS,EAAER,GAAGQ,EAAE/R,EAAE+U,MAAMhD,EAAE/R,EAAE8C,OAAOmP,EAAE,IAAID,EAAE,CAAChS,EAAEK,KAAK,GAAG,MAAM,GAAG,GAAG2R,EAAE,CAAChS,EAAE+U,MAAM,EAAE/U,EAAEK,KAAK4C,EAAE,MAAM,GAAG,GAAG+O,EAAE,CAACnF,EAAEqE,IAAI,8BAA8BlR,EAAEK,KAAKyP,EAAE,MAAM9P,EAAEsU,MAAM,GAAGtC,EAAEhS,EAAEK,KAAK,GAAG,KAAK,GAAG,GAAGL,EAAEsU,MAAM,CAAC,IAAIwB,EAAE9V,EAAEsU,MAAM/C,EAAEuE,GAAG,CAAC,GAAG,IAAItG,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAEvR,EAAE8C,QAAQwO,GAAG,GAAGtR,EAAEsU,OAAO,EAAEhD,KAAKtR,EAAEsU,MAAM/C,GAAGvR,EAAEsU,MAAMtU,EAAE+U,MAAM/U,EAAEsU,MAAMtU,EAAEgV,IAAIhV,EAAE8C,OAAO9C,EAAEK,KAAK,GAAG,KAAK,GAAG,KAAKsV,EAAE3V,EAAE+Q,SAASO,GAAG,GAAGtR,EAAEiR,UAAU,GAAGc,EAAE4D,IAAI,GAAG3D,EAAE2D,IAAI,GAAG,IAAI1D,EAAE,MAAM0D,IAAI5D,GAAGR,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAG,IAAI,IAAIS,GAAG,CAAC,IAAIuD,EAAExD,EAAEyD,EAAExD,EAAEyD,EAAExD,EAAE0D,EAAE3V,EAAE+Q,SAAS0E,IAAInE,GAAG,GAAGiE,EAAEC,GAAG,IAAID,IAAIxD,EAAE4D,IAAI,GAAG3D,EAAE2D,IAAI,GAAG,IAAI1D,EAAE,MAAM0D,IAAIJ,EAAExD,GAAGR,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAED,KAAKiE,EAAEhE,GAAGgE,EAAEvV,EAAE+U,MAAMQ,EAAE,GAAGjE,KAAKS,EAAER,GAAGQ,EAAE/R,EAAE+U,MAAMhD,EAAE,GAAGC,EAAE,CAACnF,EAAEqE,IAAI,wBAAwBlR,EAAEK,KAAKyP,EAAE,MAAM9P,EAAEqU,OAAOpC,EAAEjS,EAAEsU,MAAM,GAAGtC,EAAEhS,EAAEK,KAAK,GAAG,KAAK,GAAG,GAAGL,EAAEsU,MAAM,CAAC,IAAIwB,EAAE9V,EAAEsU,MAAM/C,EAAEuE,GAAG,CAAC,GAAG,IAAItG,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAEvR,EAAEqU,QAAQ/C,GAAG,GAAGtR,EAAEsU,OAAO,EAAEhD,KAAKtR,EAAEsU,MAAM/C,GAAGvR,EAAEsU,MAAMtU,EAAE+U,MAAM/U,EAAEsU,MAAM,GAAGtU,EAAEqU,OAAOrU,EAAEwQ,KAAK,CAAC3D,EAAEqE,IAAI,gCAAgClR,EAAEK,KAAKyP,EAAE,MAAM9P,EAAEK,KAAK,GAAG,KAAK,GAAG,GAAG,IAAI2P,EAAE,MAAMnD,EAAE,GAAG6E,EAAED,EAAEzB,EAAEhQ,EAAEqU,OAAO3C,EAAE,CAAC,GAAGA,EAAE1R,EAAEqU,OAAO3C,EAAEA,EAAE1R,EAAE0Q,OAAO1Q,EAAEmR,KAAK,CAACtE,EAAEqE,IAAI,gCAAgClR,EAAEK,KAAKyP,EAAE,MAAM4B,EAAE1R,EAAE2Q,OAAOe,GAAG1R,EAAE2Q,MAAMgB,EAAE3R,EAAEyQ,MAAMiB,GAAGC,EAAE3R,EAAE2Q,MAAMe,EAAEA,EAAE1R,EAAE8C,SAAS4O,EAAE1R,EAAE8C,QAAQ8O,EAAE5R,EAAE4Q,YAAYgB,EAAEjS,EAAEgS,EAAEnS,EAAEQ,EAAEqU,OAAO3C,EAAE1R,EAAE8C,OAAO4O,EAAE1B,IAAI0B,EAAE1B,GAAGA,GAAG0B,EAAE1R,EAAE8C,QAAQ4O,EAAE,GAAG/R,EAAEH,KAAKoS,EAAED,aAAaD,GAAG,IAAI1R,EAAE8C,SAAS9C,EAAEK,KAAK,IAAI,MAAM,KAAK,GAAG,GAAG,IAAI2P,EAAE,MAAMnD,EAAElN,EAAEH,KAAKQ,EAAE8C,OAAOkN,IAAIhQ,EAAEK,KAAK,GAAG,MAAM,KAAK,GAAG,GAAGL,EAAE+T,KAAK,CAAC,KAAKxC,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAGE,GAAGzB,EAAEnD,EAAEqI,WAAWzD,EAAEzR,EAAEkU,OAAOzC,EAAEA,IAAI5E,EAAEsI,MAAMnV,EAAEoG,MAAMpG,EAAEiU,MAAMtT,EAAEX,EAAEoG,MAAMzG,EAAE8R,EAAEjS,EAAEiS,GAAGrR,EAAEJ,EAAEoG,MAAMzG,EAAE8R,EAAEjS,EAAEiS,IAAIA,EAAEzB,GAAGhQ,EAAEiU,MAAM3C,EAAEvB,EAAEuB,MAAMtR,EAAEoG,MAAM,CAACyG,EAAEqE,IAAI,uBAAuBlR,EAAEK,KAAKyP,EAAE,MAAMwB,EAAE,EAAEC,EAAE,EAAEvR,EAAEK,KAAK,GAAG,KAAK,GAAG,GAAGL,EAAE+T,MAAM/T,EAAEiU,MAAM,CAAC,KAAK1C,EAAE,IAAI,CAAC,GAAG,IAAI/B,EAAE,MAAM3C,EAAE2C,IAAI8B,GAAGrQ,EAAE7B,MAAMmS,EAAEA,GAAG,EAAE,GAAGD,KAAK,WAAWtR,EAAEkU,OAAO,CAACrH,EAAEqE,IAAI,yBAAyBlR,EAAEK,KAAKyP,EAAE,MAAMwB,EAAE,EAAEC,EAAE,EAAEvR,EAAEK,KAAK,GAAG,KAAK,GAAGqV,EAAE/F,EAAE,MAAM9C,EAAE,KAAKiD,EAAE4F,EAAE7F,EAAE,MAAMhD,EAAE,KAAK,GAAG,OAAOjL,EAAE,KAAK,GAAG,QAAQ,OAAOgO,EAAE,OAAO/C,EAAEwD,SAAS7Q,EAAEqN,EAAE0D,UAAUP,EAAEnD,EAAEqD,QAAQ9Q,EAAEyN,EAAEuD,SAASZ,EAAExP,EAAE6Q,KAAKS,EAAEtR,EAAEoK,KAAKmH,GAAGvR,EAAEyQ,OAAOgB,IAAI5E,EAAE0D,WAAWvQ,EAAEK,KAAKyP,IAAI9P,EAAEK,KAAK,IAAIlB,IAAII,KAAKuS,EAAEjF,EAAEA,EAAEyD,OAAOzD,EAAEwD,SAASoB,EAAE5E,EAAE0D,WAAWiB,GAAG3E,EAAEuD,SAASqB,GAAG5E,EAAE0D,UAAU1D,EAAEoI,UAAUzD,EAAE3E,EAAEqI,WAAWzD,EAAEzR,EAAEkU,OAAOzC,EAAEzR,EAAE+T,MAAMtC,IAAI5E,EAAEsI,MAAMnV,EAAEoG,MAAMpG,EAAEiU,MAAMtT,EAAEX,EAAEoG,MAAMzG,EAAE8R,EAAE5E,EAAEwD,SAASoB,GAAGrR,EAAEJ,EAAEoG,MAAMzG,EAAE8R,EAAE5E,EAAEwD,SAASoB,IAAI5E,EAAE2J,UAAUxW,EAAEoK,MAAMpK,EAAE8T,KAAK,GAAG,IAAI9T,EAAEK,OAAO4C,EAAE,IAAI,IAAI,KAAKjD,EAAEK,MAAM,KAAKL,EAAEK,KAAK,IAAI,IAAI,IAAImR,GAAG,IAAIC,GAAGtS,IAAII,IAAImW,IAAInS,IAAImS,EAAE1U,GAAG0U,GAA/3Q3D,EAA64QlF,IAAI,IAAIA,IAAIA,EAAEoD,MAAM,OAAOL,EAAE,IAAIxP,EAAEyM,EAAEoD,MAAM,OAAO7P,EAAEwQ,SAASxQ,EAAEwQ,OAAO,MAAM/D,EAAEoD,MAAM,KAAK1M,GAAt+QwO,EAA0/Q,CAAClF,EAAEzM,KAAK,IAAIyM,IAAIA,EAAEoD,MAAM,OAAOL,EAAE,MAAMzQ,EAAE0N,EAAEoD,MAAM,OAAO,IAAI,EAAE9Q,EAAE4U,MAAMnE,GAAGzQ,EAAEgV,KAAK/T,EAAEA,EAAE4V,MAAK,EAAGzS,IAAtlRwO,EAA+mR,CAAClF,EAAE1N,KAAK,MAAMwB,EAAExB,EAAE2D,OAAO,IAAIQ,EAAEtD,EAAEiB,EAAE,OAAO4L,GAAGA,EAAEoD,OAAO3M,EAAEuJ,EAAEoD,MAAM,IAAI3M,EAAEyQ,MAAM,KAAKzQ,EAAEjD,KAAKuP,EAAE,KAAKtM,EAAEjD,OAAOL,EAAE,EAAEA,EAAEI,EAAEJ,EAAEb,EAAEwB,EAAE,GAAGX,IAAIsD,EAAE8C,OAAOyJ,GAAG5O,EAAE6Q,EAAEjF,EAAE1N,EAAEwB,EAAEA,GAAGM,GAAGqC,EAAEjD,KAAK,GAAGuB,IAAI0B,EAAE0Q,SAAS,EAAEzQ,KAAKqM,GAAqD,MAAMoC,EAAE,CAACnF,EAAEzM,IAAIR,OAAOkB,UAAUC,eAAe1B,KAAKwN,EAAEzM,GAAqY,IAAIoV,GAAE,EAAG,IAAItJ,OAAOmK,aAAa9I,MAAM,KAAK,IAAI8D,WAAW,IAAI,MAAMxE,GAAG2I,GAAE,EAAG,MAAMC,EAAE,IAAIpE,WAAW,KAAK,IAAI,IAAIxE,EAAE,EAAEA,EAAE,IAAIA,IAAI4I,EAAE5I,GAAGA,GAAG,IAAI,EAAEA,GAAG,IAAI,EAAEA,GAAG,IAAI,EAAEA,GAAG,IAAI,EAAEA,GAAG,IAAI,EAAE,EAAE4I,EAAE,KAAKA,EAAE,KAAK,EAAE,IAAikBC,EAAE,CAAC7I,EAAEzM,KAAK,IAAIjB,EAAEwB,EAAE,MAAM2C,EAAElD,GAAGyM,EAAE/J,OAAO9C,EAAE,IAAIkD,MAAM,EAAEI,GAAG,IAAI3C,EAAE,EAAExB,EAAE,EAAEA,EAAEmE,GAAG,CAAC,IAAIlD,EAAEyM,EAAE1N,KAAK,GAAGiB,EAAE,IAAI,CAACJ,EAAEW,KAAKP,EAAE,SAAS,IAAIa,EAAEwU,EAAErV,GAAG,GAAGa,EAAE,EAAEjB,EAAEW,KAAK,MAAMxB,GAAG8B,EAAE,MAAM,CAAC,IAAIb,GAAG,IAAIa,EAAE,GAAG,IAAIA,EAAE,GAAG,EAAEA,EAAE,GAAG9B,EAAEmE,GAAGlD,EAAEA,GAAG,EAAE,GAAGyM,EAAE1N,KAAK8B,IAAIA,EAAE,EAAEjB,EAAEW,KAAK,MAAMP,EAAE,MAAMJ,EAAEW,KAAKP,GAAGA,GAAG,MAAMJ,EAAEW,KAAK,MAAMP,GAAG,GAAG,KAAKJ,EAAEW,KAAK,MAAM,KAAKP,IAAI,MAAM,EAAEyM,EAAEzM,KAAK,GAAGA,EAAE,OAAOyM,EAAEyI,UAAUE,EAAE,OAAOtJ,OAAOmK,aAAa9I,MAAM,KAAKV,EAAE/J,SAAS1C,EAAEyM,EAAEA,EAAEyI,SAAS,EAAElV,IAAI,IAAIjB,EAAE,GAAG,IAAI,IAAIwB,EAAE,EAAEA,EAAEP,EAAEO,IAAIxB,GAAG+M,OAAOmK,aAAaxJ,EAAElM,IAAI,OAAOxB,GAA1K,CAA8Ka,EAAEW,IAAIgV,EAAE,CAAC9I,EAAEzM,MAAMA,EAAEA,GAAGyM,EAAE/J,QAAQ+J,EAAE/J,SAAS1C,EAAEyM,EAAE/J,QAAQ,IAAI3D,EAAEiB,EAAE,EAAE,KAAKjB,GAAG,GAAG,MAAM,IAAI0N,EAAE1N,KAAKA,IAAI,OAAOA,EAAE,GAAG,IAAIA,EAAEiB,EAAEjB,EAAEsW,EAAE5I,EAAE1N,IAAIiB,EAAEjB,EAAEiB,GAAGwV,EAAE,CAACa,EAAE,kBAAkBC,EAAE,aAAaC,EAAE,GAAGC,KAAK,aAAaC,KAAK,eAAeC,KAAK,aAAaC,KAAK,sBAAsBC,KAAK,eAAeC,KAAK,wBAA4BpB,EAAE,WAAWzT,KAAK+N,MAAM,KAAK/N,KAAK8N,QAAQ,EAAE9N,KAAKgO,SAAS,EAAEhO,KAAK6S,SAAS,EAAE7S,KAAKkO,OAAO,KAAKlO,KAAKiO,SAAS,EAAEjO,KAAKmO,UAAU,EAAEnO,KAAK8S,UAAU,EAAE9S,KAAK8O,IAAI,GAAG9O,KAAK6N,MAAM,KAAK7N,KAAKoU,UAAU,EAAEpU,KAAK+S,MAAM,GAAOW,EAAE,WAAW1T,KAAK0K,KAAK,EAAE1K,KAAK6T,KAAK,EAAE7T,KAAK8T,OAAO,EAAE9T,KAAK+T,GAAG,EAAE/T,KAAKkS,MAAM,KAAKlS,KAAKgU,UAAU,EAAEhU,KAAK3C,KAAK,GAAG2C,KAAKkU,QAAQ,GAAGlU,KAAKmU,KAAK,EAAEnU,KAAK4T,MAAK,GAAI,MAAMD,EAAEnW,OAAOkB,UAAU6H,UAAUuJ,WAAWjN,EAAEqN,SAAS4E,EAAEzE,KAAK0E,EAAEzE,aAAa0E,EAAEzE,YAAY0E,GAAExE,eAAeyE,GAAGxE,aAAayE,GAAGxE,YAAYyE,IAAIhI,EAAE,SAASiI,GAAG5K,GAAGzK,KAAKsV,QAAx6E,SAAS7K,GAAG,MAAMzM,EAAE8C,MAAMpC,UAAUoH,MAAM7I,KAAKsY,UAAU,GAAG,KAAKvX,EAAE0C,QAAQ,CAAC,MAAM3D,EAAEiB,EAAEwF,QAAQ,GAAGzG,EAAE,CAAC,GAAG,iBAAiBA,EAAE,MAAM,IAAIyY,UAAUzY,EAAE,sBAAsB,IAAI,MAAMiB,KAAKjB,EAAE6S,EAAE7S,EAAEiB,KAAKyM,EAAEzM,GAAGjB,EAAEiB,KAAK,OAAOyM,EAA6tEoF,CAAE,CAAC4F,UAAU,MAAMC,WAAW,GAAGC,GAAG,IAAIlL,GAAG,IAAI,MAAMzM,EAAEgC,KAAKsV,QAAQtX,EAAE4X,KAAK5X,EAAE0X,YAAY,GAAG1X,EAAE0X,WAAW,KAAK1X,EAAE0X,YAAY1X,EAAE0X,WAAW,IAAI1X,EAAE0X,aAAa1X,EAAE0X,YAAY,OAAO1X,EAAE0X,YAAY,GAAG1X,EAAE0X,WAAW,KAAKjL,GAAGA,EAAEiL,aAAa1X,EAAE0X,YAAY,IAAI1X,EAAE0X,WAAW,IAAI1X,EAAE0X,WAAW,IAAI,IAAI,GAAG1X,EAAE0X,cAAc1X,EAAE0X,YAAY,IAAI1V,KAAK6V,IAAI,EAAE7V,KAAK8O,IAAI,GAAG9O,KAAK8V,OAAM,EAAG9V,KAAK+V,OAAO,GAAG/V,KAAKgW,KAAK,IAAIvC,EAAEzT,KAAKgW,KAAK7H,UAAU,EAAE,IAAIpR,EAAE4S,EAAe3P,KAAKgW,KAAKhY,EAAE0X,YAAY,GAAG3Y,IAAIgY,EAAE,MAAM,IAAI5R,MAAMqQ,EAAEzW,IAAI,GAAGiD,KAAKiW,OAAO,IAAIvC,EAAE/D,EAAmB3P,KAAKgW,KAAKhW,KAAKiW,QAAQjY,EAAEkY,aAAa,iBAAiBlY,EAAEkY,WAAWlY,EAAEkY,WAAl8EzL,KAAI,IAAIzM,EAAEjB,EAAEwB,EAAE2C,EAAEtD,EAAEiB,EAAE4L,EAAE/J,OAAOnD,EAAE,EAAE,IAAI2D,EAAE,EAAEA,EAAErC,EAAEqC,IAAInE,EAAE0N,EAAE0L,WAAWjV,GAAG,QAAQ,MAAMnE,IAAImE,EAAE,EAAErC,IAAIN,EAAEkM,EAAE0L,WAAWjV,EAAE,GAAG,QAAQ,MAAM3C,KAAKxB,EAAE,OAAOA,EAAE,OAAO,KAAKwB,EAAE,OAAO2C,MAAM3D,GAAGR,EAAE,IAAI,EAAEA,EAAE,KAAK,EAAEA,EAAE,MAAM,EAAE,EAAE,IAAIiB,EAAE,IAAIiR,WAAW1R,GAAGK,EAAE,EAAEsD,EAAE,EAAEtD,EAAEL,EAAE2D,IAAInE,EAAE0N,EAAE0L,WAAWjV,GAAG,QAAQ,MAAMnE,IAAImE,EAAE,EAAErC,IAAIN,EAAEkM,EAAE0L,WAAWjV,EAAE,GAAG,QAAQ,MAAM3C,KAAKxB,EAAE,OAAOA,EAAE,OAAO,KAAKwB,EAAE,OAAO2C,MAAMnE,EAAE,IAAIiB,EAAEJ,KAAKb,EAAEA,EAAE,MAAMiB,EAAEJ,KAAK,IAAIb,IAAI,EAAEiB,EAAEJ,KAAK,IAAI,GAAGb,GAAGA,EAAE,OAAOiB,EAAEJ,KAAK,IAAIb,IAAI,GAAGiB,EAAEJ,KAAK,IAAIb,IAAI,EAAE,GAAGiB,EAAEJ,KAAK,IAAI,GAAGb,IAAIiB,EAAEJ,KAAK,IAAIb,IAAI,GAAGiB,EAAEJ,KAAK,IAAIb,IAAI,GAAG,GAAGiB,EAAEJ,KAAK,IAAIb,IAAI,EAAE,GAAGiB,EAAEJ,KAAK,IAAI,GAAGb,GAAG,OAAOiB,GAAq5DqE,CAAErE,EAAEkY,YAAY,yBAAyBvC,EAAE1W,KAAKe,EAAEkY,cAAclY,EAAEkY,WAAW,IAAIjH,WAAWjR,EAAEkY,aAAalY,EAAE4X,MAAM7Y,EAAE4S,EAAuB3P,KAAKgW,KAAKhY,EAAEkY,YAAYnZ,IAAIgY,IAAI,MAAM,IAAI5R,MAAMqQ,EAAEzW,IAAI,SAASqZ,GAAG3L,EAAEzM,GAAG,MAAMjB,EAAE,IAAIsY,GAAGrX,GAAG,GAAGjB,EAAE0E,KAAKgJ,GAAG1N,EAAE8Y,IAAI,MAAM9Y,EAAE+R,KAAK0E,EAAEzW,EAAE8Y,KAAK,OAAO9Y,EAAE0G,OAAO4R,GAAG3W,UAAU+C,KAAK,SAASgJ,EAAEzM,GAAG,MAAMjB,EAAEiD,KAAKgW,KAAKzX,EAAEyB,KAAKsV,QAAQG,UAAUvU,EAAElB,KAAKsV,QAAQY,WAAW,IAAItY,EAAEiB,EAAEtB,EAAE,GAAGyC,KAAK8V,MAAM,OAAM,EAAG,IAAIjX,EAAEb,MAAMA,EAAEA,GAAE,IAAKA,EAAE8W,EAAEjS,EAAE,yBAAyB8Q,EAAE1W,KAAKwN,GAAG1N,EAAEgR,MAAM,IAAIkB,WAAWxE,GAAG1N,EAAEgR,MAAMtD,EAAE1N,EAAE+Q,QAAQ,EAAE/Q,EAAEiR,SAASjR,EAAEgR,MAAMrN,SAAS,CAAC,IAAI,IAAI3D,EAAEoR,YAAYpR,EAAEmR,OAAO,IAAIe,WAAW1Q,GAAGxB,EAAEkR,SAAS,EAAElR,EAAEoR,UAAU5P,GAAGX,EAAE+R,EAAU5S,EAAE8B,GAAGjB,IAAIqX,IAAG/T,IAAItD,EAAE+R,EAAuB5S,EAAEmE,GAAGtD,IAAImX,EAAEnX,EAAE+R,EAAU5S,EAAE8B,GAAGjB,IAAIuX,KAAKvX,EAAEqX,KAAIlY,EAAEiR,SAAS,GAAGpQ,IAAIoX,GAAGjY,EAAE8Q,MAAM8D,KAAK,GAAG,IAAIlH,EAAE1N,EAAE+Q,UAAU6B,EAAe5S,GAAGa,EAAE+R,EAAU5S,EAAE8B,GAAG,OAAOjB,GAAG,KAAKsX,GAAG,KAAKC,GAAG,KAAKF,GAAE,KAAKG,GAAG,OAAOpV,KAAKqW,MAAMzY,GAAGoC,KAAK8V,OAAM,GAAG,EAAG,GAAGvY,EAAER,EAAEoR,UAAUpR,EAAEkR,WAAW,IAAIlR,EAAEoR,WAAWvQ,IAAIoX,GAAG,GAAG,WAAWhV,KAAKsV,QAAQK,GAAG,CAAC,IAAIlL,EAAE8I,EAAExW,EAAEmR,OAAOnR,EAAEkR,UAAUjQ,EAAEjB,EAAEkR,SAASxD,EAAEvJ,EAAEoS,EAAEvW,EAAEmR,OAAOzD,GAAG1N,EAAEkR,SAASjQ,EAAEjB,EAAEoR,UAAU5P,EAAEP,EAAEA,GAAGjB,EAAEmR,OAAO+E,IAAIlW,EAAEmR,OAAOgF,SAASzI,EAAEA,EAAEzM,GAAG,GAAGgC,KAAKsW,OAAOpV,QAAQlB,KAAKsW,OAAOvZ,EAAEmR,OAAOxN,SAAS3D,EAAEkR,SAASlR,EAAEmR,OAAOnR,EAAEmR,OAAOgF,SAAS,EAAEnW,EAAEkR,WAAW,GAAGrQ,IAAImX,GAAG,IAAIxX,EAAE,CAAC,GAAGK,IAAIoX,EAAE,OAAOpX,EAAE+R,EAAa3P,KAAKgW,MAAMhW,KAAKqW,MAAMzY,GAAGoC,KAAK8V,OAAM,GAAG,EAAG,GAAG,IAAI/Y,EAAEiR,SAAS,OAAO,OAAM,GAAIqH,GAAG3W,UAAU4X,OAAO,SAAS7L,GAAGzK,KAAK+V,OAAOtU,KAAKgJ,IAAI4K,GAAG3W,UAAU2X,MAAM,SAAS5L,GAAGA,IAAIsK,IAAI,WAAW/U,KAAKsV,QAAQK,GAAG3V,KAAKyD,OAAOzD,KAAK+V,OAAOlK,KAAK,IAAI7L,KAAKyD,OAA1xIgH,KAAI,IAAIzM,EAAE,EAAE,IAAI,IAAIjB,EAAE,EAAEwB,EAAEkM,EAAE/J,OAAO3D,EAAEwB,EAAExB,IAAIiB,GAAGyM,EAAE1N,GAAG2D,OAAO,MAAM3D,EAAE,IAAIkS,WAAWjR,GAAG,IAAI,IAAIA,EAAE,EAAEO,EAAE,EAAE2C,EAAEuJ,EAAE/J,OAAO1C,EAAEkD,EAAElD,IAAI,CAAC,IAAIkD,EAAEuJ,EAAEzM,GAAGjB,EAAEkW,IAAI/R,EAAE3C,GAAGA,GAAG2C,EAAER,OAAO,OAAO3D,GAAgoIoW,CAAEnT,KAAK+V,SAAS/V,KAAK+V,OAAO,GAAG/V,KAAK6V,IAAIpL,EAAEzK,KAAK8O,IAAI9O,KAAKgW,KAAKlH,KAAK,IAAIyH,GAAGlB,GAAGmB,GAAGJ,GAAGK,GAAG,SAAShM,EAAEzM,GAAG,OAAOA,EAAEA,GAAG,IAAI4X,KAAI,EAAGQ,GAAG3L,EAAEzM,IAAI0Y,GAAGN,GAAGO,GAAGvJ,EAAEwJ,GAAG,CAACC,QAAQN,GAAGO,QAAQN,GAAGO,WAAWN,GAAGO,OAAON,GAAGO,UAAUN,IAAIlM,EAAEoM,QAAQN,GAAG9L,EAAEwM,UAAUN,GAAGlM,EAAEyM,QAAQN,GAAGnM,EAAEqM,QAAQN,GAAG/L,EAAEsM,WAAWN,GAAGhM,EAAEuM,OAAON,GAAGlZ,OAAOC,eAAegN,EAAE,aAAa,CAAC1M,OAAM,IAA3koBC,CAAEnB,IAKjB,SAAUC,EAAQD,GAExBC,EAAOD,QAAU,SAASC,GAoBzB,OAnBKA,EAAOqa,kBACXra,EAAOsa,UAAY,aACnBta,EAAOua,MAAQ,GAEVva,EAAOwa,WAAUxa,EAAOwa,SAAW,IACxC9Z,OAAOC,eAAeX,EAAQ,SAAU,CACvCY,YAAY,EACZC,IAAK,WACJ,OAAOb,EAAOE,KAGhBQ,OAAOC,eAAeX,EAAQ,KAAM,CACnCY,YAAY,EACZC,IAAK,WACJ,OAAOb,EAAOC,KAGhBD,EAAOqa,gBAAkB,GAEnBra,IAMF,SAAUA,EAAQya,EAAqB5a,GAE7C,aAQA,SAAS6a,KAAiBC,GACtB,MAAM/W,EAAS+W,EAAKC,OAAO,CAACC,EAAKnY,IAAMmY,GAAOnY,EAAEoY,YAAcpY,EAAEkB,QAAS,GACnE8J,EAAM,IAAIyE,WAAWvO,GAC3B,IAAImX,EAAa,EAKjB,OAJAJ,EAAKK,QAAQ3W,IACTqJ,EAAIyI,IAAI9R,aAAa4W,YAAc,IAAI9I,WAAW9N,GAAKA,EAAG0W,GAC1DA,GAAc1W,EAAEyW,YAAczW,EAAET,SAE7B8J,EAdX7N,EAAoBiB,EAAE2Z,GAGtB5a,EAAoBS,EAAEma,EAAqB,mBAAmB,WAAa,OAAqBS,MAqBhG/I,WAAWvQ,UAAU8D,OAAS,YAAaiV,GACvC,OAAOD,EAAcxX,QAASyX,IAKlCxI,WAAWvQ,UAAU4N,OAAS,WAC1B,MAAO,IAAItM,OAGfiY,QAAQvZ,UAAUwZ,QAAUD,QAAQvZ,UAAUwZ,SAAW,SAAU9O,GAC/D,MAAM+O,EAAaC,GAAaH,QAAQI,QAAQjP,KAAMkP,KAAKF,GAC3D,OAAOpY,KAAKsY,KAAK7U,GAAU0U,EAAU,IAAM1U,GAAS8U,GAAUJ,EAAU,IAAMF,QAAQO,OAAOD,MAcjG,MAAME,EAAQ,CACVvM,KAAMwM,SAASC,OAAO1M,QAAQ,UAAY,EAC1C2M,MAAOF,SAASC,OAAO1M,QAAQ,WAAa,EAC5C4M,MAAM,EACNC,KAAK,EACLC,qBAAqB,EACrBC,iBAAiB,EACjBC,UAAW,aAEfR,EAAMI,KAAOH,SAASC,OAAO1M,QAAQ,UAAY,EAC7CwM,EAAMI,OACNJ,EAAMQ,UAAY,SAEO,IAAIC,EAAQ,EASzC,MAAMC,EAAkBD,EAAMN,MAExBQ,EAD0B,oBAAb,OAA2B5K,OAAStL,KAE1B,IAAI0V,EAAQ,EAmDzC,MAAMS,EAAwD,oBAA7BC,0BAA4CpW,gBAAgBoW,yBACvFC,EAA6C,oBAAtBC,mBAAqCtW,gBAAgBsW,oBAAsBH,EAClGI,EAAYF,GAAiBF,EAM7BK,EAAsB,CAACC,KAAQlC,KACjCvU,KACK0W,QACAC,SAAS,CAAEC,qBAAqB,EAAOC,KAAM,WAC7CzB,KAAM0B,IACFA,EAAUtZ,QAIfsZ,EAAUlU,MAAM6T,EAAM,GAAK,GAAG7B,QAAQmC,IAElCA,EAASC,eAAezC,QAI9B0C,EAAe,IAAI1C,KAErBvU,KAAKgX,eAAezC,IAElB2C,EAAO,OACPC,EAAgBhB,EAAoBK,EAAoBpb,KAAK,MAAM,GAAUib,EAAgBY,EAAeC,EAC5GE,EAAYjB,EAAoBK,EAAoBpb,KAAK,MAAM,GAASib,EAAgBY,EAAeC,EAgB7G,MAAMG,EACFC,cACIxa,KAAKya,OAAS,GACdza,KAAK0a,MAAQ,GACb1a,KAAK2a,YAAa,EACdzB,EAAMhN,OACNlM,KAAKya,OAAS,MAGtBD,IAAInc,EAAKuc,GAAW,GAChB,GAAI5a,KAAK0a,MAAM/b,eAAeN,IAAQuc,EAClC,OAAO5a,KAAK0a,MAAMrc,GAEjB,GAAI2B,KAAK2a,WAAY,CACtB,IAAI5c,EACJ,IACIA,EAAQ8c,aAAaC,QAAQ9a,KAAKya,OAASpc,GAE/C,MAAOwX,GACH7V,KAAK2a,YAAa,EAEtB,GAAc,OAAV5c,EACA,IACIA,EAAQgd,KAAKC,MAAMjd,GAEvB,MAAO8X,SAKP9X,OAAQiB,EAEZ,OAAOjB,GAKfyc,IAAIS,EAAKC,GAAY,GACjB,IAAK,MAAM7c,KAAO4c,EACd,GAAIA,EAAItc,eAAeN,GAAM,CACzB,MAAMN,EAAQkd,EAAI5c,GAElB,GADA2B,KAAK0a,MAAMrc,GAAON,EACdiC,KAAK2a,aAAeO,EACpB,IACI,MAAMC,EAAcJ,KAAKnP,UAAU7N,GACnC8c,aAAaO,QAAQpb,KAAKya,OAASpc,EAAK8c,GAE5C,MAAOtF,GACH7V,KAAK2a,YAAa,IAMtCH,OAAOnc,EAAKgd,GAAY,GAEpBhd,EAAM,GAAKA,EACNgd,UACMrb,KAAK0a,MAAMrc,GAGtB,IACIwc,aAAaS,WAAWtb,KAAKya,OAASpc,GAE1C,MAAOwX,KA2BX2E,QACI,MAAMe,EAAO,CAAC,KAAM,qBAAsB,cAAe,YAAa,YACtE,IAAK,IAAIxe,EAAI,EAAGA,GAAK,IAAKA,EACtBwe,EAAK9Z,KAAK,KAAK1E,iBACfwe,EAAK9Z,KAAK,KAAK1E,cAEnB,IAAK,IAAIsB,KAAOkd,EACZvb,KAAKwb,OAAOnd,GAAK,GAGzBmc,cAAciB,GAEV,GADAzb,KAAK2a,WAAac,EACbA,EAID,OAAOzb,KAAKiT,IAAIjT,KAAK0a,OAHrB1a,KAAK0b,SASjB,MAAMC,EACFnB,cACIxa,KAAK4b,OAAS,EACd5b,KAAK6b,MAAQ,GACbF,EAAoCG,SAASra,KAAKzB,MAC7CyZ,IACDzZ,KAAK+b,QAAU,IAAIxB,GAG3BC,WAAWoB,EAAQnY,GAEVzD,KAAK6b,MAAMld,eAAeid,KAI/B5b,KAAK6b,MAAMD,GAAQnY,UACZzD,KAAK6b,MAAMD,IAEtBpB,MAAMT,KAAStC,GACX,OAAO,IAAIQ,QAAQ,CAACI,EAASG,KACzB,GAAIiB,EAAW,CACX,MAAMmC,EAAS5b,KAAK4b,SACpB5b,KAAK6b,MAAMD,GAAUvD,EASrBgC,EARa,CACTN,KAAM,oBACNiC,GAAIJ,EACJK,QAAS,CACLlC,OACAtC,cAKP,CACDA,EAAO3W,MAAMpC,UAAUoH,MAAM7I,KAAKwa,GAGlCY,EADerY,KAAK+b,QAAQhC,GAAM5O,MAAMnL,KAAK+b,QAAStE,OAKlE+C,IAAInc,EAAKuc,GACL,OAAO5a,KAAKkc,MAAM,MAAO7d,EAAKuc,GAElCJ,IAAIS,EAAKC,GACL,OAAOlb,KAAKkc,MAAM,MAAOjB,EAAKC,GAElCV,OAAOnc,EAAKgd,GACR,OAAOrb,KAAKkc,MAAM,SAAU7d,EAAKgd,GAErCb,QACI,OAAOxa,KAAKkc,MAAM,SAEtB1B,cAAciB,GACV,OAAOzb,KAAKkc,MAAM,gBAAiBT,IAG3CE,EAAoCG,SAAW,GAU/C,MAAMK,EAAiB,IAAIR,EAC3BvC,EAAegD,WAAaD,EACC,IAAIE,EAAqB,EAQrBC,EAAiB,CAAGC,QAAW,CAAEC,aAAgB,CAAC,CAAER,GAAM,UAAWS,UAAa,SAAUC,OAAU,GAAI3C,KAAQ,YAAc,CAAEiC,GAAM,SAAUS,UAAa,QAASC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,KAAM0c,KAAQ,SAAW,CAAE1c,KAAQ,iCAAkC0c,KAAQ,iBAAmBA,KAAQ,SAAW,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAW,CAAE1c,KAAQ,IAAK0c,KAAQ,SAAW,CAAE1c,KAAQ,IAAK0c,KAAQ,SAAW,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAW,CAAE1c,KAAQ,IAAK0c,KAAQ,SAAW,CAAE1c,KAAQ,IAAK0c,KAAQ,SAAW,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,mBAAoB0c,KAAQ,UAAYA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAW,CAAE1c,KAAQ,MAAO0c,KAAQ,SAAW,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAUA,KAAQ,wBAA0B,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAYA,KAAQ,wBAA0B,CAAEiC,GAAM,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,WAAaA,KAAQ,+BAAiC,CAAEiC,GAAM,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,WAAaA,KAAQ,+BAAiC,CAAEiC,IAAO,WAAYS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,WAAaA,KAAQ,+BAAiC,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,QAAU,CAAE1c,KAAQ,mBAAoB0c,KAAQ,QAAU,CAAE1c,KAAQ,mBAAoB0c,KAAQ,QAAU,CAAE1c,KAAQ,kBAAmB0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,gBAAiB0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,wBAA0BA,KAAQ,eAAiB,CAAEiC,GAAM,UAAWS,UAAa,OAAQC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,qBAAuBA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,UAAWS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,YAAcA,KAAQ,eAAiB,CAAEiC,GAAM,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,UAAYA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,gBAAiB0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,gBAAiB0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,SAAWA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,gBAAkB,CAAEiC,GAAM,SAAUS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,eAAiB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,gBAAiB0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,gBAAiB0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,sBAAwB4C,QAAW,CAAC,CAAEX,IAAO,WAAYY,OAAU,eAAgBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,SAAW,CAAEiC,IAAO,UAAWY,OAAU,gBAAiBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,IAAK0c,KAAQ,SAAW,CAAE1c,KAAQ,IAAK0c,KAAQ,SAAW,CAAE1c,KAAQ,yBAA0B0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,UAAYA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,iBAAkB0c,KAAQ,UAAYA,KAAQ,+BAAiC,CAAEiC,GAAM,WAAYY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYY,OAAU,mBAAoBF,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,eAAiB,CAAEiC,GAAM,WAAYY,OAAU,OAAQF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,mBAAoB0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,YAAaF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,YAAc,CAAEiC,IAAO,UAAWY,OAAU,mBAAoBF,OAAU,GAAI3C,KAAQ,uBAA0B8C,IAAO,CAAEL,aAAgB,CAAC,CAAER,IAAO,WAAYS,UAAa,YAAaC,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,IAAO,WAAYS,UAAa,WAAYC,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,GAAM,WAAYS,UAAa,OAAQC,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,GAAM,UAAWS,UAAa,SAAUC,OAAU,GAAI3C,KAAQ,YAAc,CAAEiC,IAAO,UAAWS,UAAa,QAASC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,SAAW,CAAEiC,GAAM,WAAYS,UAAa,OAAQC,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,gBAAiBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkBA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,cAAgB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkBA,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,kBAAoBA,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,qBAAuB,CAAE1c,KAAQ,QAAS0c,KAAQ,qBAAuB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,mBAAqBA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,eAAiBA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkBA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,UAAYA,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,UAAYA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,UAAWS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,QAASS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,cAAgB,CAAEiC,GAAM,QAASS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,WAAYS,UAAa,OAAQC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,aAAe,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,wBAA0B,CAAE1c,KAAQ,eAAgB0c,KAAQ,4BAA8B,CAAE1c,KAAQ,wBAAyB0c,KAAQ,8BAAgCA,KAAQ,QAAU,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,IAAO,UAAWS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,oBAAsB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,sBAAwB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,+BAAiC,CAAE1c,KAAQ,WAAY0c,KAAQ,2BAA6B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,2BAA6B,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,4BAA6B0c,KAAQ,iBAAmB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,yBAA2B,CAAE1c,KAAQ,sBAAuB0c,KAAQ,4BAA8BA,KAAQ,YAAc,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,mBAAoB0c,KAAQ,4BAA8BA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,eAAgB0c,KAAQ,2BAA6B,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,4BAA8B,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,8BAAgC,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,wBAA0B,CAAE1c,KAAQ,eAAgB0c,KAAQ,uBAAyB,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,2BAA6B,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,mBAAqB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,YAAa0c,KAAQ,6BAA+B,CAAE1c,KAAQ,qBAAsB0c,KAAQ,sCAAwC,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,8BAAgC,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkBA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,aAAeA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,SAAUC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,oBAAqB0c,KAAQ,OAAS,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,wBAAyB0c,KAAQ,OAAS,CAAE1c,KAAQ,yBAA0B0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,sBAAwB,CAAE1c,KAAQ,MAAO0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,wBAA0B,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,SAAW,CAAEiC,IAAO,SAAUS,UAAa,QAASC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,qBAAuB,CAAE1c,KAAQ,cAAe0c,KAAQ,6BAA+B,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,SAAW,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,aAAe,CAAEiC,GAAM,SAAUS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,gBAAiBC,OAAU,GAAI3C,KAAQ,YAAc,CAAEiC,IAAO,WAAYS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkBA,KAAQ,YAAc,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,qBAAuB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,yBAA2B,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,0BAA2B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,2BAA6B,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,0BAA2B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,iBAAmB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkBA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,YAAc,CAAE1c,KAAQ,WAAY0c,KAAQ,8BAAgCA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,sBAAwB,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,eAAiB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,uBAAwB0c,KAAQ,oBAAsBA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiBA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,2BAA6B,CAAE1c,KAAQ,kBAAmB0c,KAAQ,0BAA4B,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,uBAAyB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,uBAAyB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,eAAiB,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,YAAc,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,4BAA8B,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,2BAA4BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,QAASS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,eAAiB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,sBAAwBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,sBAAwBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,qBAAuBA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,oBAAsB,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAWA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,SAAUS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,4BAA8B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoBA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,4BAA8B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,kBAAoBA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,GAAI3C,KAAQ,WAAa,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,4BAA8B,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,8BAAgC,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,4BAA8B,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,8BAAgC,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,GAAM,WAAYS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,IAAO,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,SAAW,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,oBAAsB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,eAAiB,CAAEiC,GAAM,UAAWS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,mBAAqBA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,SAAUC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,qBAAsB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,uBAAwB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,4BAA6B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,oBAAsB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,UAAY,CAAE1c,KAAQ,gBAAiB0c,KAAQ,OAAS,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,sBAAuB0c,KAAQ,OAAS,CAAE1c,KAAQ,0BAA2B0c,KAAQ,OAAS,CAAE1c,KAAQ,0BAA2B0c,KAAQ,OAAS,CAAE1c,KAAQ,0BAA2B0c,KAAQ,OAAS,CAAE1c,KAAQ,0BAA2B0c,KAAQ,OAAS,CAAE1c,KAAQ,wBAAyB0c,KAAQ,OAAS,CAAE1c,KAAQ,0BAA2B0c,KAAQ,OAAS,CAAE1c,KAAQ,sBAAuB0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,OAAS,CAAE1c,KAAQ,oBAAqB0c,KAAQ,OAAS,CAAE1c,KAAQ,uBAAwB0c,KAAQ,OAAS,CAAE1c,KAAQ,iBAAkB0c,KAAQ,OAAS,CAAE1c,KAAQ,wBAAyB0c,KAAQ,OAAS,CAAE1c,KAAQ,uBAAwB0c,KAAQ,OAAS,CAAE1c,KAAQ,6BAA8B0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,2BAA4B0c,KAAQ,OAAS,CAAE1c,KAAQ,4BAA6B0c,KAAQ,OAAS,CAAE1c,KAAQ,0BAA2B0c,KAAQ,OAAS,CAAE1c,KAAQ,uBAAwB0c,KAAQ,OAAS,CAAE1c,KAAQ,0BAA2B0c,KAAQ,OAAS,CAAE1c,KAAQ,yBAA0B0c,KAAQ,OAAS,CAAE1c,KAAQ,gBAAiB0c,KAAQ,UAAY,CAAE1c,KAAQ,wBAAyB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,uBAAwB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,gBAAiB0c,KAAQ,OAAS,CAAE1c,KAAQ,sBAAuB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,eAAiB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,yBAA2B,CAAE1c,KAAQ,WAAY0c,KAAQ,oBAAsB,CAAE1c,KAAQ,MAAO0c,KAAQ,kBAAoB,CAAE1c,KAAQ,UAAW0c,KAAQ,qBAAuBA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,oBAAsB,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,QAAU,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAYA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAW,CAAE1c,KAAQ,kBAAmB0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoBA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,UAAYA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,SAAW,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAYA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,iCAAmC,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoBA,KAAQ,iCAAmC,CAAEiC,IAAO,SAAUS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,qBAAuBA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,qBAAuB,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,6BAA+B,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkBA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,iBAAmB,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,oBAAsB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkBA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,UAAYA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,SAAW,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,6BAA+B,CAAE1c,KAAQ,eAAgB0c,KAAQ,6BAA+B,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,8BAAgCA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,cAAeC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,cAAeC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,uBAAyBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,SAAUS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,eAAiB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,0BAA4BA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,cAAgB,CAAE1c,KAAQ,QAAS0c,KAAQ,wBAA0BA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,sBAAwBA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,oCAAqCC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,sBAAwBA,KAAQ,oBAAsB,CAAEiC,IAAO,OAAQS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,eAAiB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,eAAiB,CAAEiC,IAAO,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,eAAiB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,GAAM,SAAUS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,mBAAqB,CAAE1c,KAAQ,cAAe0c,KAAQ,uBAAyBA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoBA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,qBAAuBA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmBA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWS,UAAa,kCAAmCC,OAAU,GAAI3C,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,uBAAyBA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,6BAA+B,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,IAAO,UAAWS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,WAAY0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,oBAAsB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,sCAAwCA,KAAQ,WAAa,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,YAAcA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,8BAA+B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,iBAAkB0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,yBAA0B0c,KAAQ,OAAS,CAAE1c,KAAQ,iBAAkB0c,KAAQ,0BAA4BA,KAAQ,0BAA4B,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,2BAA6B,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,4BAA6B0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,yBAA2B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,SAAW,CAAE1c,KAAQ,qBAAsB0c,KAAQ,gBAAkBA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,iCAAmCA,KAAQ,4BAA8B,CAAEiC,IAAO,WAAYS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,2BAA6B,CAAE1c,KAAQ,oBAAqB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,iCAAmCA,KAAQ,iCAAmC,CAAEiC,GAAM,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,gBAAiB0c,KAAQ,WAAaA,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,YAAc,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,SAAW,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,yBAA2BA,KAAQ,cAAgB,CAAEiC,GAAM,SAAUS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,eAAiB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,QAASS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,eAAiB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,6BAA+B,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,cAAgB,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,YAAa0c,KAAQ,qBAAuBA,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYS,UAAa,OAAQC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,MAAO0c,KAAQ,iBAAmB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,MAAO0c,KAAQ,iBAAmB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,4BAA8B,CAAE1c,KAAQ,SAAU0c,KAAQ,sBAAwB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,sCAAwC,CAAE1c,KAAQ,yBAA0B0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,oBAAsBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,uBAAyBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,2BAA6BA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmBA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,mBAAqBA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,6BAA+B,CAAE1c,KAAQ,cAAe0c,KAAQ,mBAAqBA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,wBAA0B,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,MAAO0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,qBAAsB0c,KAAQ,qCAAuC,CAAE1c,KAAQ,eAAgB0c,KAAQ,4BAA8B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,6BAA+B,CAAE1c,KAAQ,wBAAyB0c,KAAQ,6BAA+B,CAAE1c,KAAQ,qBAAsB0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,wBAAyB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,qBAAsB0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,OAAS,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,SAAW,CAAE1c,KAAQ,kBAAmB0c,KAAQ,sBAAwB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,+BAAiC,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,uBAAwB0c,KAAQ,eAAiB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,eAAiB,CAAE1c,KAAQ,aAAc0c,KAAQ,sBAAwB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,4BAA8B,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,0BAA2B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,2BAA6B,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,2BAA6B,CAAE1c,KAAQ,4BAA6B0c,KAAQ,iBAAmB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,yBAA2B,CAAE1c,KAAQ,kBAAmB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,4BAA8BA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,eAAiB,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,eAAiB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,mCAAoCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,uBAAwB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,yBAA2BA,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,eAAgB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,WAAaA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,8BAAgC,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,gCAAkC,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,sBAAwB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,+BAAiC,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,6BAA+B,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,YAAc,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,yBAA2B,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkBA,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,wBAA0BA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,qBAAuBA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,yBAA2B,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,4BAA8B,CAAE1c,KAAQ,UAAW0c,KAAQ,4BAA8B,CAAE1c,KAAQ,eAAgB0c,KAAQ,0BAA4BA,KAAQ,wBAA0B,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,UAAW0c,KAAQ,uBAAyB,CAAE1c,KAAQ,eAAgB0c,KAAQ,qBAAuBA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,6BAA+B,CAAE1c,KAAQ,UAAW0c,KAAQ,2BAA6B,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,oBAAsB,CAAE1c,KAAQ,YAAa0c,KAAQ,+BAAiC,CAAE1c,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,oBAAsB,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,oCAAsCA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,2BAA4BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,eAAiB,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqBA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,IAAO,SAAUS,UAAa,mCAAoCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,SAAUS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,8BAAgCA,KAAQ,eAAiB,CAAEiC,GAAM,UAAWS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,gBAAiB0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,mBAAqBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,4BAA8B,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,gCAAiC0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,yBAA2B,CAAEiC,GAAM,WAAYS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYS,UAAa,oCAAqCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,yBAA2B,CAAEiC,GAAM,SAAUS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,YAAc,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,gCAAiC0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,YAAc,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,cAAgB,CAAE1c,KAAQ,eAAgB0c,KAAQ,0BAA4BA,KAAQ,wBAA0B,CAAEiC,IAAO,OAAQS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmB,CAAE1c,KAAQ,eAAgB0c,KAAQ,0BAA4BA,KAAQ,wBAA0B,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,oBAAsB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,eAAgB0c,KAAQ,qBAAuBA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,2BAA6B,CAAEiC,GAAM,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,2BAA6B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,mBAAqBA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoBA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,SAAUS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,oBAAsBA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,gCAAkC,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkBA,KAAQ,gBAAkB,CAAEiC,IAAO,SAAUS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,eAAiB,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,uCAAwCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,6BAA+B,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmBA,KAAQ,6BAA+B,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,qCAAsCC,OAAU,GAAI3C,KAAQ,2BAA6B,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,WAAY0c,KAAQ,oBAAsB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkBA,KAAQ,2BAA6B,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,8BAAgCA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWS,UAAa,0CAA2CC,OAAU,GAAI3C,KAAQ,oCAAsC,CAAEiC,GAAM,UAAWS,UAAa,0CAA2CC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,8BAAgCA,KAAQ,oCAAsC,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,cAAgB,CAAE1c,KAAQ,QAAS0c,KAAQ,aAAeA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,eAAgBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkBA,KAAQ,cAAgB,CAAEiC,IAAO,SAAUS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkBA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,cAAgB,CAAE1c,KAAQ,SAAU0c,KAAQ,qBAAuBA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,UAAY,CAAE1c,KAAQ,IAAK0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,eAAiBA,KAAQ,uBAAyB,CAAEiC,GAAM,SAAUS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,kBAAoBA,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYS,UAAa,OAAQC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,SAAW,CAAE1c,KAAQ,WAAY0c,KAAQ,qBAAuBA,KAAQ,QAAU,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,0BAA4BA,KAAQ,wBAA0B,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,yBAA2B,CAAEiC,IAAO,SAAUS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,cAAgBA,KAAQ,cAAgB,CAAEiC,GAAM,SAAUS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,aAAe,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,qBAAuB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,YAAaC,OAAU,GAAI3C,KAAQ,YAAc,CAAEiC,GAAM,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,GAAM,WAAYS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,IAAO,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,IAAO,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,IAAO,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,GAAM,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,GAAM,WAAYS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,YAAc,CAAEiC,IAAO,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,GAAM,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,qBAAuBA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,YAAc,CAAE1c,KAAQ,iBAAkB0c,KAAQ,QAAUA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,yBAA2BA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,MAAO0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,cAAgBA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,kBAAoB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,IAAK0c,KAAQ,eAAiB,CAAE1c,KAAQ,IAAK0c,KAAQ,eAAiB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,kBAAmB0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,qBAAuB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,qBAAuB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,GAAM,SAAUS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,qBAAuB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkBA,KAAQ,WAAa,CAAEiC,IAAO,SAAUS,UAAa,2BAA4BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,0BAA4B,CAAEiC,IAAO,UAAWS,UAAa,mCAAoCC,OAAU,GAAI3C,KAAQ,0BAA4B,CAAEiC,GAAM,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,0BAA4B,CAAEiC,IAAO,SAAUS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,0BAA4B,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,OAAQ0c,KAAQ,eAAiBA,KAAQ,UAAY,CAAEiC,IAAO,SAAUS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,+BAAiCA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,UAAWC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,6BAA8B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,wBAA0B,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,yBAA2BA,KAAQ,WAAa,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,4BAA8B,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAW,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,gBAAiB0c,KAAQ,YAAc,CAAE1c,KAAQ,cAAe0c,KAAQ,mBAAqBA,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,qBAAsB0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,gCAAkC,CAAE1c,KAAQ,qBAAsB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoBA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,6BAA8B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,eAAiB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,WAAaA,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,wBAA0BA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,2BAA6B,CAAEiC,GAAM,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,8BAAgCA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,8BAAgCA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,wBAA0B,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,oBAAsB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,uBAAwB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,oBAAsB,CAAE1c,KAAQ,aAAc0c,KAAQ,gCAAkC,CAAE1c,KAAQ,oBAAqB0c,KAAQ,mCAAqC,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,kBAAoB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,mCAAqCA,KAAQ,mCAAqC,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,YAAcA,KAAQ,0BAA4B,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,OAAQ0c,KAAQ,gCAAkC,CAAE1c,KAAQ,WAAY0c,KAAQ,0BAA4B,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,QAAU,CAAE1c,KAAQ,oBAAqB0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,2BAA6B,CAAEiC,IAAO,SAAUS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,wBAAyB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,iCAAmCA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAYA,KAAQ,2BAA6B,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,2BAA6B,CAAEiC,IAAO,UAAWS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,SAAW,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAUA,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,yBAA2BA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAW,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,gCAAkC,CAAE1c,KAAQ,qBAAsB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,SAAWA,KAAQ,UAAY,CAAEiC,IAAO,QAASS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,uBAAyBA,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,cAAgBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,qBAAuB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAW,CAAE1c,KAAQ,WAAY0c,KAAQ,sBAAwBA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,QAAU,CAAE1c,KAAQ,MAAO0c,KAAQ,SAAW,CAAE1c,KAAQ,WAAY0c,KAAQ,sBAAwBA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAW,CAAE1c,KAAQ,kBAAmB0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,qBAAuB,CAAE1c,KAAQ,cAAe0c,KAAQ,2BAA6B,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,kCAAoC,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAYA,KAAQ,mBAAqB,CAAEiC,IAAO,SAAUS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,mBAAqBA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmBA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,kCAAoC,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkBA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,SAAW,CAAE1c,KAAQ,iBAAkB0c,KAAQ,SAAW,CAAE1c,KAAQ,gBAAiB0c,KAAQ,SAAW,CAAE1c,KAAQ,cAAe0c,KAAQ,qBAAuBA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,gBAAiB0c,KAAQ,UAAYA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,yBAA2BA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,2BAA6BA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,iBAAkB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,gBAAiB0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,uBAAyBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,gBAAiB0c,KAAQ,qBAAuBA,KAAQ,sBAAwB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,WAAaA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,WAAaA,KAAQ,6BAA+B,CAAEiC,IAAO,UAAWS,UAAa,wCAAyCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,wCAAyCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,2CAA4CC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,wCAAyCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAW,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAYA,KAAQ,8BAAgC,CAAEiC,GAAM,UAAWS,UAAa,0CAA2CC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,8BAAgC,CAAEiC,GAAM,UAAWS,UAAa,6CAA8CC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,yCAA0CC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,YAAcA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,wCAAyCC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,WAAa,CAAE1c,KAAQ,cAAe0c,KAAQ,YAAcA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,0CAA2CC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,YAAcA,KAAQ,8BAAgC,CAAEiC,GAAM,UAAWS,UAAa,4CAA6CC,OAAU,GAAI3C,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,6CAA8CC,OAAU,GAAI3C,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,8CAA+CC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,uBAAyBA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,iDAAkDC,OAAU,CAAC,CAAErf,KAAQ,mBAAoB0c,KAAQ,sBAAwB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,uBAAyBA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,mDAAoDC,OAAU,CAAC,CAAErf,KAAQ,mBAAoB0c,KAAQ,sBAAwB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,uBAAyBA,KAAQ,8BAAgC,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,+BAAiCA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,gCAAkC,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,4BAA8B,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoBA,KAAQ,+BAAiC,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,oCAAqCC,OAAU,GAAI3C,KAAQ,0BAA4B,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,WAAY0c,KAAQ,qBAAuBA,KAAQ,0BAA4B,CAAEiC,IAAO,UAAWS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,oCAAqCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,6CAA8CC,OAAU,CAAC,CAAErf,KAAQ,kBAAmB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,oBAAsBA,KAAQ,8BAAgC,CAAEiC,IAAO,SAAUS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,aAAeA,KAAQ,2BAA6B,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,mBAAoB0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,mDAAoDC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,gCAAiC0c,KAAQ,gBAAkBA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,YAAc,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,gCAAiC0c,KAAQ,gBAAkBA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiBA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,sBAAwBA,KAAQ,eAAiB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,uBAAyB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,0CAA2CC,OAAU,GAAI3C,KAAQ,gCAAkC,CAAEiC,GAAM,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,cAAgB,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,kCAAoCA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,iBAAkB0c,KAAQ,4BAA8B,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAUA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAUA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,IAAO,SAAUS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,uCAAwCC,OAAU,GAAI3C,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,8BAAgCA,KAAQ,6BAA+B,CAAEiC,GAAM,WAAYS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,YAAc,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,8BAAgCA,KAAQ,eAAiB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,wBAA0BA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAYA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAYA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAW,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAYA,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,kCAAmCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,SAAUS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,sCAAuCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,uCAAwCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,aAAc0c,KAAQ,sBAAwB,CAAE1c,KAAQ,eAAgB0c,KAAQ,sBAAwB,CAAE1c,KAAQ,SAAU0c,KAAQ,sBAAwB,CAAE1c,KAAQ,cAAe0c,KAAQ,8BAAgC,CAAE1c,KAAQ,QAAS0c,KAAQ,8BAAgC,CAAE1c,KAAQ,aAAc0c,KAAQ,2BAA6B,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,aAAc0c,KAAQ,2BAA6B,CAAE1c,KAAQ,eAAgB0c,KAAQ,2BAA6B,CAAE1c,KAAQ,SAAU0c,KAAQ,2BAA6B,CAAE1c,KAAQ,cAAe0c,KAAQ,mCAAqC,CAAE1c,KAAQ,QAAS0c,KAAQ,mCAAqC,CAAE1c,KAAQ,aAAc0c,KAAQ,4BAA8BA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,GAAM,SAAUS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAW,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAYA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,iBAAkB0c,KAAQ,8BAAgC,CAAE1c,KAAQ,SAAU0c,KAAQ,uBAAyB,CAAE1c,KAAQ,SAAU0c,KAAQ,4BAA8B,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,mBAAqBA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,gBAAiB0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,uBAAyB,CAAE1c,KAAQ,cAAe0c,KAAQ,+BAAiCA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,4BAA8BA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,kCAAoCA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,2BAA4BC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,eAAiBA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,QAASS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYS,UAAa,kDAAmDC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,yBAA2B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,SAAW,CAAE1c,KAAQ,mBAAoB0c,KAAQ,SAAWA,KAAQ,wBAA0B,CAAEiC,GAAM,UAAWS,UAAa,oEAAqEC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,SAAW,CAAE1c,KAAQ,QAAS0c,KAAQ,SAAW,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,UAAYA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,IAAK0c,KAAQ,SAAW,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAYA,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,mCAAoCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,uBAAwB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,oBAAsBA,KAAQ,sBAAwB,CAAEiC,GAAM,SAAUS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,+BAAiCA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,aAAeA,KAAQ,uBAAyB,CAAEiC,GAAM,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,cAAgBA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,WAAYC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,sBAAwBA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,4BAA8BA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,GAAM,SAAUS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,QAAUA,KAAQ,YAAc,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,oBAAsB,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,0BAA4BA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,YAAc,CAAE1c,KAAQ,OAAQ0c,KAAQ,yBAA2BA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,SAAU0c,KAAQ,aAAeA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,sBAAwBA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,sBAAwBA,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,gCAAkCA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,qBAAuB,CAAE1c,KAAQ,QAAS0c,KAAQ,aAAeA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkBA,KAAQ,sBAAwB,CAAEiC,GAAM,UAAWS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,YAAc,CAAE1c,KAAQ,WAAY0c,KAAQ,+BAAiCA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,YAAc,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,OAAQC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,qBAAuB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,YAAa0c,KAAQ,oBAAsB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,SAAUS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,yBAA2B,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAYA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,OAAQC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,sBAAwB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAW,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,oCAAsC,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,wBAA0B,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,kCAAoCA,KAAQ,eAAiB,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,kBAAmB0c,KAAQ,yBAA2B,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,kCAAoCA,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,eAAiB,CAAEiC,GAAM,WAAYS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoBA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,eAAgB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,eAAgB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,wBAAyB0c,KAAQ,oBAAsB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,WAAaA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWS,UAAa,gDAAiDC,OAAU,CAAC,CAAErf,KAAQ,qBAAsB0c,KAAQ,oBAAsB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,qBAAuBA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,qCAAsCC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,YAAcA,KAAQ,8BAAgC,CAAEiC,GAAM,UAAWS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,sBAAwBA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,0BAA4BA,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,eAAiB,CAAE1c,KAAQ,0BAA2B0c,KAAQ,eAAiB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,eAAiB,CAAE1c,KAAQ,0BAA2B0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkBA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,uBAAwB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,OAAS,CAAE1c,KAAQ,iBAAkB0c,KAAQ,OAAS,CAAE1c,KAAQ,gBAAiB0c,KAAQ,OAAS,CAAE1c,KAAQ,0BAA2B0c,KAAQ,QAAUA,KAAQ,wBAA0B,CAAEiC,GAAM,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,wBAA0B,CAAE1c,KAAQ,SAAU0c,KAAQ,wBAA0B,CAAE1c,KAAQ,OAAQ0c,KAAQ,yBAA2BA,KAAQ,gCAAkC,CAAEiC,IAAO,UAAWS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,mBAAqBA,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,mBAAqBA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,yBAA2BA,KAAQ,2BAA6B,CAAEiC,IAAO,WAAYS,UAAa,WAAYC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,IAAO,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,8BAA+BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,SAAW,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,iBAAkB0c,KAAQ,SAAW,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,mBAAqB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,SAAUS,UAAa,SAAUC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,0BAA2B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,8BAA+B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,sBAAwBA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,2BAA4B0c,KAAQ,OAAS,CAAE1c,KAAQ,6BAA8B0c,KAAQ,OAAS,CAAE1c,KAAQ,8BAA+B0c,KAAQ,OAAS,CAAE1c,KAAQ,gCAAiC0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,cAAgB,CAAEiC,IAAO,SAAUS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,cAAgB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,sBAAwB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,aAAe,CAAEiC,GAAM,SAAUS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,SAAUS,UAAa,8BAA+BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,SAAUS,UAAa,6CAA8CC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,0BAA4B,CAAEiC,GAAM,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,uBAAwB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,cAAgBA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,uBAAwB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,yCAA0CC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWS,UAAa,4CAA6CC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,oCAAqCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,eAAiB,CAAEiC,GAAM,WAAYS,UAAa,uCAAwCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,SAAUS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,YAAc,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,wBAA0BA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,2CAA4CC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,oBAAsBA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,2CAA4CC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,mCAAoCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gCAAkCA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,qCAAsCC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,0BAA4B,CAAEiC,GAAM,SAAUS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,YAAcA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,cAAgB,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,QAASC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,oBAAsB,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkBA,KAAQ,SAAW,CAAEiC,IAAO,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoBA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,gBAAiB0c,KAAQ,uBAAyBA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,uBAAwB0c,KAAQ,iBAAmBA,KAAQ,2BAA6B,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,0BAA4B,CAAEiC,IAAO,WAAYS,UAAa,mBAAoBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,IAAO,SAAUS,UAAa,eAAgBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,8BAAgCA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,0BAA2B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,aAAe,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,sBAAuB0c,KAAQ,eAAiB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,uBAAyB,CAAE1c,KAAQ,YAAa0c,KAAQ,0BAA4B,CAAE1c,KAAQ,qBAAsB0c,KAAQ,8BAAgCA,KAAQ,sBAAwB,CAAEiC,IAAO,SAAUS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,0BAA2B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,aAAe,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,sBAAuB0c,KAAQ,eAAiB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,uBAAyB,CAAE1c,KAAQ,YAAa0c,KAAQ,sBAAwBA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,4BAA8B,CAAE1c,KAAQ,WAAY0c,KAAQ,0BAA4BA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,2BAA6B,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,mBAAqBA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,4BAA8BA,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,eAAiB,CAAEiC,GAAM,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,eAAgB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,eAAgB0c,KAAQ,qBAAuB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,qBAAuB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,sBAAwBA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,WAAaA,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,yBAA2BA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,sBAAuBC,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,YAAc,CAAE1c,KAAQ,aAAc0c,KAAQ,mBAAqBA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,sBAAwB,CAAE1c,KAAQ,YAAa0c,KAAQ,wBAA0B,CAAE1c,KAAQ,iBAAkB0c,KAAQ,wBAA0B,CAAE1c,KAAQ,kBAAmB0c,KAAQ,wBAA0B,CAAE1c,KAAQ,wBAAyB0c,KAAQ,qBAAuB,CAAE1c,KAAQ,eAAgB0c,KAAQ,cAAgB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,cAAgB,CAAE1c,KAAQ,aAAc0c,KAAQ,cAAgB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,cAAgB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,cAAgB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,cAAgB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,cAAgB,CAAE1c,KAAQ,gCAAiC0c,KAAQ,cAAgB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,cAAgB,CAAE1c,KAAQ,8BAA+B0c,KAAQ,uCAAyCA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,mBAAqBA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,iBAAkB0c,KAAQ,mBAAqBA,KAAQ,aAAe,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,gBAAiB0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,uBAAyB,CAAEiC,IAAO,UAAWS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAUA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,sBAAwB,CAAE1c,KAAQ,UAAW0c,KAAQ,wBAA0B,CAAE1c,KAAQ,WAAY0c,KAAQ,wBAA0B,CAAE1c,KAAQ,UAAW0c,KAAQ,wBAA0B,CAAE1c,KAAQ,UAAW0c,KAAQ,wBAA0B,CAAE1c,KAAQ,eAAgB0c,KAAQ,cAAgB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,cAAgB,CAAE1c,KAAQ,8BAA+B0c,KAAQ,cAAgB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,cAAgB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,cAAgB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,cAAgB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,cAAgB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,cAAgB,CAAE1c,KAAQ,cAAe0c,KAAQ,+BAAiC,CAAE1c,KAAQ,aAAc0c,KAAQ,8BAAgC,CAAE1c,KAAQ,eAAgB0c,KAAQ,gCAAkC,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,wCAAyC0c,KAAQ,iBAAmBA,KAAQ,yBAA2B,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,0BAA4B,CAAE1c,KAAQ,WAAY0c,KAAQ,2BAA6BA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,6BAA+BA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,wBAA0B,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYS,UAAa,eAAgBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,eAAiB,CAAE1c,KAAQ,WAAY0c,KAAQ,eAAiB,CAAE1c,KAAQ,UAAW0c,KAAQ,2BAA6BA,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,SAAUS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,IAAK0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkBA,KAAQ,aAAe,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,wBAA0B,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWS,UAAa,mCAAoCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,oCAAqCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,eAAiB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,eAAiB,CAAE1c,KAAQ,eAAgB0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,kBAAmB0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkBA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,wBAA0B,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkBA,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,cAAeC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,eAAiB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,sBAAwBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAWA,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,IAAK0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkBA,KAAQ,6BAA+B,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,eAAiB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,eAAiB,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,eAAiBA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,mCAAoCC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,YAAaC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,wBAAyB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,4BAA6B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,qBAAsB0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,eAAiB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,eAAiB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,aAAe,CAAEiC,IAAO,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkBA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,eAAgB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqB,CAAE1c,KAAQ,oBAAqB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,QAAS0c,KAAQ,qCAAuC,CAAE1c,KAAQ,eAAgB0c,KAAQ,uCAAyCA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,aAAcC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gCAAkC,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,kBAAmBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,eAAgB0c,KAAQ,gCAAkC,CAAE1c,KAAQ,2BAA4B0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,gCAAkC,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,2BAA6B,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,uBAAyB,CAAEiC,IAAO,UAAWS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYS,UAAa,+BAAgCC,OAAU,GAAI3C,KAAQ,uBAAyB,CAAEiC,GAAM,UAAWS,UAAa,2CAA4CC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,6CAA8CC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,4CAA6CC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,yBAA2BA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,8CAA+CC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,yBAA2BA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,mDAAoDC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,mCAAoCC,OAAU,CAAC,CAAErf,KAAQ,gBAAiB0c,KAAQ,aAAeA,KAAQ,2BAA6B,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,SAAWA,KAAQ,0BAA4B,CAAEiC,IAAO,UAAWS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,gCAAkC,CAAEiC,IAAO,UAAWS,UAAa,wBAAyBC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkBA,KAAQ,kCAAoC,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkBA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,mBAAoB0c,KAAQ,2BAA6B,CAAE1c,KAAQ,kBAAmB0c,KAAQ,2BAA6B,CAAE1c,KAAQ,SAAU0c,KAAQ,8BAAgC,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,2BAA4BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,mBAAoB0c,KAAQ,8BAAgC,CAAE1c,KAAQ,kBAAmB0c,KAAQ,8BAAgC,CAAE1c,KAAQ,SAAU0c,KAAQ,8BAAgC,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,qBAAsBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmBA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,8BAAgC,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,gCAAkC,CAAEiC,GAAM,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,sBAAwB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,+BAAiC,CAAEiC,GAAM,UAAWS,UAAa,sCAAuCC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,sBAAwB,CAAE1c,KAAQ,aAAc0c,KAAQ,sBAAwB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,+BAAiC,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,8BAAgC,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,gCAAkC,CAAEiC,IAAO,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,gBAAiB0c,KAAQ,OAAS,CAAE1c,KAAQ,wBAAyB0c,KAAQ,QAAUA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,gCAAkC,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,kCAAoC,CAAEiC,GAAM,WAAYS,UAAa,oDAAqDC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,uBAAyBA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,iDAAkDC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,uBAAyBA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,iDAAkDC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,uBAAyBA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,+CAAgDC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,sBAAwB,CAAE1c,KAAQ,aAAc0c,KAAQ,uBAAyBA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,8CAA+CC,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,yBAA2BA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,6CAA8CC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYS,UAAa,oCAAqCC,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,WAAaA,KAAQ,qCAAuC,CAAEiC,GAAM,SAAUS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,gBAAiB0c,KAAQ,eAAiB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkBA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,iCAAmC,CAAEiC,IAAO,UAAWS,UAAa,oCAAqCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,4BAA8B,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAa,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAW,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,gBAAiB0c,KAAQ,YAAc,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,6BAA8B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,QAAU,CAAE1c,KAAQ,eAAgB0c,KAAQ,wBAA0BA,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWS,UAAa,uCAAwCC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,wCAA0C,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gDAAkD,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkBA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,aAAeA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,+BAAiC,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,0BAA2BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,+BAAiC,CAAEiC,IAAO,UAAWS,UAAa,qCAAsCC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,+BAAiC,CAAEiC,IAAO,UAAWS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,+BAAiC,CAAEiC,GAAM,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,uBAAyBA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAW,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,sBAAwB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,eAAgB0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,kCAAoCA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,4BAA8B,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,8BAAgC,CAAEiC,GAAM,UAAWS,UAAa,yCAA0CC,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,aAAeA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,2BAA6B,CAAEiC,IAAO,UAAWS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,+BAAiC,CAAEiC,GAAM,UAAWS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,eAAiB,CAAE1c,KAAQ,UAAW0c,KAAQ,uCAAyC,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,kCAAoC,CAAEiC,GAAM,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,yBAA2B,CAAEiC,GAAM,WAAYS,UAAa,kCAAmCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,kCAAoCA,KAAQ,mCAAqC,CAAEiC,IAAO,UAAWS,UAAa,mCAAoCC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,mBAAoB0c,KAAQ,OAAS,CAAE1c,KAAQ,oBAAqB0c,KAAQ,iBAAmBA,KAAQ,UAAY,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,sBAAwB,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,UAAY,CAAEiC,IAAO,WAAYS,UAAa,qDAAsDC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,sBAAwB,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,iCAAkCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,4BAA6BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWS,UAAa,6CAA8CC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,iCAAkCC,OAAU,GAAI3C,KAAQ,uBAAyB,CAAEiC,GAAM,UAAWS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,YAAc,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYS,UAAa,wBAAyBC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWS,UAAa,wCAAyCC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,YAAcA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWS,UAAa,0BAA2BC,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,iBAAkBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,oBAAqB0c,KAAQ,kBAAoBA,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,qBAAuBA,KAAQ,UAAY,CAAEiC,GAAM,WAAYS,UAAa,gBAAiBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYS,UAAa,mBAAoBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,yBAA2B,CAAE1c,KAAQ,mBAAoB0c,KAAQ,wCAA0CA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,+BAAiC,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,mBAAqBA,KAAQ,iCAAmC,CAAEiC,IAAO,WAAYS,UAAa,oBAAqBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,YAAc,CAAE1c,KAAQ,mBAAoB0c,KAAQ,YAAc,CAAE1c,KAAQ,mBAAoB0c,KAAQ,YAAc,CAAE1c,KAAQ,qBAAsB0c,KAAQ,YAAc,CAAE1c,KAAQ,mBAAoB0c,KAAQ,YAAc,CAAE1c,KAAQ,mBAAoB0c,KAAQ,oBAAsB,CAAE1c,KAAQ,cAAe0c,KAAQ,qBAAuBA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYS,UAAa,yCAA0CC,OAAU,GAAI3C,KAAQ,+BAAiC,CAAEiC,GAAM,WAAYS,UAAa,8BAA+BC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,8BAAgCA,KAAQ,+BAAiC,CAAEiC,GAAM,UAAWS,UAAa,uBAAwBC,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYS,UAAa,qDAAsDC,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,mBAAqBA,KAAQ,8BAAgC,CAAEiC,GAAM,WAAYS,UAAa,6BAA8BC,OAAU,GAAI3C,KAAQ,2BAA6B,CAAEiC,IAAO,WAAYS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,2BAA6B,CAAEiC,GAAM,WAAYS,UAAa,sBAAuBC,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYS,UAAa,yBAA0BC,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,oBAAqB0c,KAAQ,SAAWA,KAAQ,0BAA4B,CAAEiC,IAAO,UAAWS,UAAa,gCAAiCC,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,mCAAqCA,KAAQ,iCAAmC,CAAEiC,GAAM,UAAWS,UAAa,gCAAiCC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYS,UAAa,mCAAoCC,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWS,UAAa,+BAAgCC,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,MAAO0c,KAAQ,WAAaA,KAAQ,iCAAmC4C,QAAW,CAAC,CAAEX,IAAO,UAAWY,OAAU,iBAAkBF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAASA,KAAQ,KAAO,CAAEiC,GAAM,WAAYY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAASA,KAAQ,KAAO,CAAEiC,IAAO,WAAYY,OAAU,gBAAiBF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYY,OAAU,cAAeF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYY,OAAU,cAAeF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYY,OAAU,cAAeF,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYY,OAAU,2BAA4BF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,8BAAgC,CAAEiC,IAAO,WAAYY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,mBAAoB0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAU,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,oBAAqB0c,KAAQ,UAAYA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAW,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqB,CAAE1c,KAAQ,WAAY0c,KAAQ,4BAA8BA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,oBAAsBA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWY,OAAU,8BAA+BF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,iBAAkBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,sBAAwBA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,cAAgBA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,GAAI3C,KAAQ,yBAA2B,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,yBAA2BA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,sBAAwBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,mBAAqBA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,iBAAkBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,mBAAoBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,yBAA2BA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,IAAK0c,KAAQ,UAAY,CAAE1c,KAAQ,UAAW0c,KAAQ,qBAAuB,CAAE1c,KAAQ,aAAc0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,eAAiB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkBA,KAAQ,4BAA8B,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,6BAA+B,CAAEiC,GAAM,SAAUY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,iCAAmC,CAAEiC,GAAM,WAAYY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,aAAc0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,sBAAwBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,kBAAmB0c,KAAQ,eAAiB,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,eAAgB0c,KAAQ,uBAAyB,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,uBAAyBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,kBAAmB0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,cAAgB,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,eAAgB0c,KAAQ,uBAAyB,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,uBAAyBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,iBAAmB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,YAAa0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,uBAAyBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,iBAAmBA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,qBAAuB,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,mBAAoBF,OAAU,GAAI3C,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,kBAAmB0c,KAAQ,eAAiB,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,eAAiBA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,qBAAuB,CAAE1c,KAAQ,QAAS0c,KAAQ,qBAAuB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,mBAAqBA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,uBAAyBA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,iBAAkBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,qBAAuB,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWY,OAAU,iBAAkBF,OAAU,GAAI3C,KAAQ,UAAY,CAAEiC,GAAM,UAAWY,OAAU,oBAAqBF,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,GAAM,WAAYY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYY,OAAU,qBAAsBF,OAAU,GAAI3C,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,OAAS,CAAE1c,KAAQ,gBAAiB0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,MAAO0c,KAAQ,UAAYA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,MAAO0c,KAAQ,SAAW,CAAE1c,KAAQ,kBAAmB0c,KAAQ,SAAWA,KAAQ,iBAAmB,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,iCAAmC,CAAEiC,GAAM,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,uBAAyBA,KAAQ,iCAAmC,CAAEiC,GAAM,UAAWY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,iCAAmC,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,uBAAyBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,mBAAoB0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,iBAAkBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,iBAAkB0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,UAAY,CAAE1c,KAAQ,mBAAoB0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,4BAA8B,CAAE1c,KAAQ,SAAU0c,KAAQ,qBAAuB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAASA,KAAQ,KAAO,CAAEiC,IAAO,WAAYY,OAAU,kBAAmBF,OAAU,GAAI3C,KAAQ,gBAAkB,CAAEiC,GAAM,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,oBAAsBA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,6BAA+BA,KAAQ,wBAA0B,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,wBAAyBF,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,mBAAqBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAASA,KAAQ,KAAO,CAAEiC,IAAO,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,yBAA2B,CAAEiC,IAAO,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,wBAA0B,CAAEiC,GAAM,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,iBAAkB0c,KAAQ,WAAaA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,kCAAoCA,KAAQ,gBAAkB,CAAEiC,IAAO,UAAWY,OAAU,4BAA6BF,OAAU,GAAI3C,KAAQ,0BAA4B,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,IAAO,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,0BAA4BA,KAAQ,4BAA8B,CAAEiC,IAAO,WAAYY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,yBAA2B,CAAE1c,KAAQ,eAAgB0c,KAAQ,kCAAoCA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,0BAA4BA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWY,OAAU,+BAAgCF,OAAU,GAAI3C,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,0CAA4CA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,OAASA,KAAQ,KAAO,CAAEiC,IAAO,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,0BAA2B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,cAAgB,CAAEiC,GAAM,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,uBAAyB,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,mBAAqB,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAWA,KAAQ,oCAAsC,CAAEiC,IAAO,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,oBAAsBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,cAAe0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,mBAAoB0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,6BAA+B,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,yBAA2BA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,6BAA+B,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,gCAAkC,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,cAAgBA,KAAQ,+BAAiC,CAAEiC,GAAM,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,yBAA2BA,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,yBAA2B,CAAE1c,KAAQ,UAAW0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,eAAgB0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,sBAAwBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,SAAUY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,yBAA2B,CAAE1c,KAAQ,MAAO0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,IAAK0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,SAAW,CAAE1c,KAAQ,OAAQ0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,sBAAwB,CAAEiC,GAAM,UAAWY,OAAU,mBAAoBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,yBAA2B,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,uBAAyB,CAAEiC,IAAO,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,gCAAkC,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,8BAAgCA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,kBAAmB0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,KAAM0c,KAAQ,UAAY,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,uBAAyBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAUA,KAAQ,uBAAyB,CAAEiC,GAAM,UAAWY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,WAAaA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,IAAO,SAAUY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAUA,KAAQ,4BAA8B,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,eAAgB0c,KAAQ,uBAAyB,CAAE1c,KAAQ,WAAY0c,KAAQ,iCAAmC,CAAE1c,KAAQ,gBAAiB0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,2BAA6B,CAAE1c,KAAQ,UAAW0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,uBAAyB,CAAE1c,KAAQ,eAAgB0c,KAAQ,uBAAyB,CAAE1c,KAAQ,WAAY0c,KAAQ,kCAAoCA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,kCAAoCA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,UAAW0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,GAAM,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,mBAAqB,CAAE1c,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,4BAA8BA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,kBAAmB0c,KAAQ,eAAiB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,kCAAoCA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,GAAI3C,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,6BAA+B,CAAEiC,GAAM,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,2BAA6B,CAAEiC,GAAM,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,kBAAmB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,oCAAqCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,iBAAmBA,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,wBAA0BA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,mBAAoB0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,2BAA6B,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,uBAAyB,CAAEiC,GAAM,UAAWY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,2BAA6B,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,uBAAyB,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,wBAAyB0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,MAAO0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,oBAAsBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,4BAA8BA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,gBAAiB0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,aAAeA,KAAQ,YAAc,CAAEiC,IAAO,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAeA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,wBAA0B,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,eAAgB0c,KAAQ,qBAAuBA,KAAQ,wBAA0B,CAAEiC,GAAM,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,2BAA6B,CAAEiC,IAAO,UAAWY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,yBAA2BA,KAAQ,mCAAqC,CAAEiC,GAAM,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAU,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,oBAAqB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,2BAA6B,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,0BAA4B,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,yBAA2B,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,uBAAyB,CAAEiC,GAAM,UAAWY,OAAU,wBAAyBF,OAAU,GAAI3C,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,mCAAqCA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,oCAAqCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,yBAA2B,CAAE1c,KAAQ,WAAY0c,KAAQ,+BAAiC,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqBA,KAAQ,uBAAyB,CAAEiC,IAAO,UAAWY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,kBAAoBA,KAAQ,uBAAyB,CAAEiC,IAAO,QAASY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmB,CAAE1c,KAAQ,WAAY0c,KAAQ,QAAUA,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,mBAAqB,CAAE1c,KAAQ,UAAW0c,KAAQ,wBAA0BA,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,eAAiBA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,GAAI3C,KAAQ,YAAc,CAAEiC,GAAM,WAAYY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,SAAW,CAAE1c,KAAQ,WAAY0c,KAAQ,sBAAwBA,KAAQ,mBAAqB,CAAEiC,GAAM,WAAYY,OAAU,mBAAoBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,SAAW,CAAE1c,KAAQ,WAAY0c,KAAQ,sBAAwBA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,SAAW,CAAE1c,KAAQ,kBAAmB0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,sBAAwBA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,0BAA4B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,aAAeA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAW,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAW,CAAE1c,KAAQ,gBAAiB0c,KAAQ,UAAYA,KAAQ,oBAAsB,CAAEiC,GAAM,WAAYY,OAAU,oBAAqBF,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,0BAA4B,CAAEiC,IAAO,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,4BAA8B,CAAEiC,IAAO,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,aAAe,CAAE1c,KAAQ,gBAAiB0c,KAAQ,qBAAuBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,IAAK0c,KAAQ,UAAY,CAAE1c,KAAQ,gBAAiB0c,KAAQ,uCAAyC,CAAE1c,KAAQ,SAAU0c,KAAQ,6BAA+B,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,4BAA8B,CAAEiC,GAAM,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,SAAW,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWY,OAAU,sCAAuCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,kBAAmB0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,oBAAsBA,KAAQ,QAAU,CAAEiC,GAAM,SAAUY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,0BAA4B,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,sBAAuBF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,4BAA8B,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,kBAAmB0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,4BAA8B,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,uBAAyBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,sBAAwB,CAAE1c,KAAQ,OAAQ0c,KAAQ,uBAAyBA,KAAQ,iBAAmB,CAAEiC,GAAM,UAAWY,OAAU,+BAAgCF,OAAU,GAAI3C,KAAQ,6BAA+B,CAAEiC,GAAM,UAAWY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,iCAAkCF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,IAAK0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,6BAA+B,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,qBAAuB,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,oBAAsB,CAAEiC,GAAM,UAAWY,OAAU,+BAAgCF,OAAU,GAAI3C,KAAQ,6BAA+B,CAAEiC,IAAO,UAAWY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,aAAeA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,6BAA8BF,OAAU,GAAI3C,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,4BAA8BA,KAAQ,uBAAyB,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,oBAAsB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,SAAWA,KAAQ,eAAiB,CAAEiC,IAAO,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,4BAA8BA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,6BAA+BA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,6BAA+B,CAAEiC,IAAO,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,2BAA6B,CAAE1c,KAAQ,cAAe0c,KAAQ,+BAAiCA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,iBAAmBA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,UAAY,CAAE1c,KAAQ,kBAAmB0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,oBAAqBF,OAAU,GAAI3C,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,qBAAsB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,mBAAoB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkBA,KAAQ,mBAAqB,CAAEiC,GAAM,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,GAAI3C,KAAQ,wBAA0B,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,OAASA,KAAQ,KAAO,CAAEiC,IAAO,WAAYY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,QAAU,CAAE1c,KAAQ,QAAS0c,KAAQ,OAASA,KAAQ,KAAO,CAAEiC,IAAO,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,oBAAsBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,gCAAiCF,OAAU,GAAI3C,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,0BAA2BF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,oBAAqBF,OAAU,GAAI3C,KAAQ,aAAe,CAAEiC,GAAM,WAAYY,OAAU,kBAAmBF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,0BAA4BA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,uBAAyB,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,oBAAsB,CAAEiC,IAAO,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,8BAA+BF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,GAAI3C,KAAQ,oBAAsB,CAAEiC,GAAM,SAAUY,OAAU,mBAAoBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,UAAW0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,0BAA4BA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYY,OAAU,uCAAwCF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,uCAAwCF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,4BAA8BA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,UAAW0c,KAAQ,kBAAoBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,eAAiB,CAAEiC,IAAO,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,uCAAwCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,gBAAiB0c,KAAQ,qBAAuBA,KAAQ,WAAa,CAAEiC,IAAO,SAAUY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,mBAAqBA,KAAQ,aAAe,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,sBAAwBA,KAAQ,aAAe,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAU,CAAE1c,KAAQ,WAAY0c,KAAQ,sBAAwBA,KAAQ,QAAU,CAAEiC,IAAO,SAAUY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,sBAAwBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,kCAAmCF,OAAU,GAAI3C,KAAQ,gCAAkC,CAAEiC,GAAM,WAAYY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,WAAY0c,KAAQ,yBAA2BA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,2BAA6B,CAAEiC,GAAM,UAAWY,OAAU,sCAAuCF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,eAAgB0c,KAAQ,QAAUA,KAAQ,2BAA6B,CAAEiC,GAAM,WAAYY,OAAU,qCAAsCF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,mBAAqBA,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,GAAM,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,eAAgB0c,KAAQ,4BAA8BA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,UAAW0c,KAAQ,2BAA6BA,KAAQ,kCAAoC,CAAEiC,IAAO,UAAWY,OAAU,kCAAmCF,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,qBAAuB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,MAAO0c,KAAQ,mBAAqBA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,qBAAuB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,YAAa0c,KAAQ,eAAiB,CAAE1c,KAAQ,MAAO0c,KAAQ,mBAAqBA,KAAQ,iBAAmB,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,8BAA+B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,KAAM0c,KAAQ,aAAe,CAAE1c,KAAQ,aAAc0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,KAAM0c,KAAQ,cAAgBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,WAAY0c,KAAQ,0BAA4BA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,iBAAmB,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,qBAAuB,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,YAAc,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,yBAA2B,CAAE1c,KAAQ,WAAY0c,KAAQ,uCAAyCA,KAAQ,SAAW,CAAEiC,GAAM,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,cAAgB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,WAAY0c,KAAQ,yBAA2B,CAAE1c,KAAQ,WAAY0c,KAAQ,uCAAyCA,KAAQ,SAAW,CAAEiC,IAAO,UAAWY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,cAAgB,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,sBAAwB,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,sBAAwBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,mBAAoBF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,cAAgB,CAAE1c,KAAQ,cAAe0c,KAAQ,SAAWA,KAAQ,SAAW,CAAEiC,GAAM,WAAYY,OAAU,oBAAqBF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,kBAAoB,CAAEiC,IAAO,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,UAAY,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,mBAAqB,CAAEiC,IAAO,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,UAAYA,KAAQ,iBAAmB,CAAEiC,IAAO,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,oBAAqB0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,6BAA8BF,OAAU,GAAI3C,KAAQ,2BAA6B,CAAEiC,GAAM,UAAWY,OAAU,+BAAgCF,OAAU,GAAI3C,KAAQ,0BAA4B,CAAEiC,GAAM,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,2BAA6BA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmB,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,4BAA8BA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,WAAaA,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWY,OAAU,4BAA6BF,OAAU,GAAI3C,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYY,OAAU,qCAAsCF,OAAU,GAAI3C,KAAQ,iCAAmC,CAAEiC,GAAM,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,yBAA2BA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,oCAAqCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,gBAAkBA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,wBAA0B,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,UAAY,CAAE1c,KAAQ,IAAK0c,KAAQ,iBAAmBA,KAAQ,cAAgB,CAAEiC,IAAO,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,mBAAqB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoBA,KAAQ,uBAAyB,CAAEiC,GAAM,SAAUY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,WAAY0c,KAAQ,uBAAyBA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,6BAA+B,CAAEiC,IAAO,WAAYY,OAAU,oBAAqBF,OAAU,GAAI3C,KAAQ,kBAAoB,CAAEiC,GAAM,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,IAAO,QAASY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAYA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,wBAA0B,CAAEiC,IAAO,UAAWY,OAAU,mCAAoCF,OAAU,GAAI3C,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,0BAA4BA,KAAQ,yBAA2B,CAAEiC,IAAO,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,GAAM,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,qBAAuB,CAAEiC,GAAM,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,8BAAgC,CAAEiC,IAAO,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,sBAAwB,CAAEiC,IAAO,UAAWY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,4BAA8B,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,cAAe0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,UAAW0c,KAAQ,aAAe,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,SAAU0c,KAAQ,aAAeA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,sBAAwBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,oBAAqB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,SAAUY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,mBAAqB,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,MAAO0c,KAAQ,qBAAuB,CAAE1c,KAAQ,UAAW0c,KAAQ,eAAiB,CAAE1c,KAAQ,SAAU0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,2BAA6B,CAAEiC,IAAO,WAAYY,OAAU,uBAAwBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkBA,KAAQ,eAAiB,CAAEiC,GAAM,WAAYY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,SAAU0c,KAAQ,iBAAmBA,KAAQ,kCAAoC,CAAEiC,GAAM,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,cAAe0c,KAAQ,WAAaA,KAAQ,gCAAkC,CAAEiC,GAAM,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAUA,KAAQ,0BAA4B,CAAEiC,GAAM,UAAWY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,QAAU,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAY,CAAE1c,KAAQ,QAAS0c,KAAQ,eAAiBA,KAAQ,gBAAkB,CAAEiC,IAAO,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,SAAWA,KAAQ,QAAU,CAAEiC,IAAO,WAAYY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,WAAY0c,KAAQ,aAAe,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,gCAAkC,CAAEiC,GAAM,WAAYY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,+BAAiC,CAAEiC,IAAO,WAAYY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,UAAY,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,cAAe0c,KAAQ,eAAiB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,mBAAqBA,KAAQ,+BAAiC,CAAEiC,GAAM,WAAYY,OAAU,4CAA6CF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,WAAY0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,oCAAqCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,kCAAoC,CAAEiC,IAAO,UAAWY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,YAAa0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,IAAK0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,gCAAkC,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,WAAa,CAAEiC,IAAO,SAAUY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,WAAY0c,KAAQ,cAAgB,CAAE1c,KAAQ,SAAU0c,KAAQ,gBAAkB,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,qCAAuC,CAAEiC,IAAO,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,kBAAoB,CAAE1c,KAAQ,iBAAkB0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,cAAe0c,KAAQ,aAAe,CAAE1c,KAAQ,QAAS0c,KAAQ,gBAAkB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,aAAc0c,KAAQ,gBAAkB,CAAE1c,KAAQ,gBAAiB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,eAAgB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,sBAAuB0c,KAAQ,iBAAmBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,qBAAuB,CAAEiC,IAAO,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,kBAAmB0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,iCAAmC,CAAEiC,GAAM,UAAWY,OAAU,yCAA0CF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,aAAc0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,GAAM,WAAYY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,SAAU0c,KAAQ,aAAeA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,0BAA2BF,OAAU,CAAC,CAAErf,KAAQ,aAAc0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,+BAAiC,CAAEiC,GAAM,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,sBAAuBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,mBAAqB,CAAE1c,KAAQ,YAAa0c,KAAQ,WAAaA,KAAQ,sBAAwB,CAAEiC,IAAO,WAAYY,OAAU,wBAAyBF,OAAU,GAAI3C,KAAQ,+BAAiC,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,GAAI3C,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,SAAWA,KAAQ,kBAAoB,CAAEiC,IAAO,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,YAAa0c,KAAQ,UAAYA,KAAQ,QAAU,CAAEiC,IAAO,UAAWY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,iBAAmBA,KAAQ,8BAAgC,CAAEiC,GAAM,UAAWY,OAAU,sCAAuCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,gBAAkB,CAAEiC,GAAM,WAAYY,OAAU,oCAAqCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,cAAe0c,KAAQ,QAAUA,KAAQ,kCAAoC,CAAEiC,GAAM,WAAYY,OAAU,qCAAsCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,mCAAqC,CAAEiC,GAAM,WAAYY,OAAU,+BAAgCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,WAAY0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,4BAA6BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,UAAW0c,KAAQ,SAAWA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,6BAA8BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,UAAW0c,KAAQ,cAAgBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,qBAAsBF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,wBAA0B,CAAEiC,IAAO,WAAYY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,yBAA0B0c,KAAQ,QAAUA,KAAQ,QAAU,CAAEiC,GAAM,WAAYY,OAAU,sCAAuCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,QAAU,CAAE1c,KAAQ,8BAA+B0c,KAAQ,gBAAkB,CAAE1c,KAAQ,yBAA0B0c,KAAQ,iBAAmBA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,oCAAqCF,OAAU,CAAC,CAAErf,KAAQ,UAAW0c,KAAQ,gBAAkB,CAAE1c,KAAQ,cAAe0c,KAAQ,cAAgBA,KAAQ,4BAA8B,CAAEiC,GAAM,UAAWY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,MAAO0c,KAAQ,gBAAkB,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,IAAO,WAAYY,OAAU,gCAAiCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,gBAAkBA,KAAQ,WAAa,CAAEiC,IAAO,UAAWY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,KAAM0c,KAAQ,OAAS,CAAE1c,KAAQ,WAAY0c,KAAQ,kBAAoB,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,iCAAmC,CAAEiC,GAAM,UAAWY,OAAU,qCAAsCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,sBAAuB0c,KAAQ,mBAAqBA,KAAQ,WAAa,CAAEiC,GAAM,UAAWY,OAAU,iCAAkCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,QAAUA,KAAQ,+BAAiC,CAAEiC,IAAO,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,WAAY0c,KAAQ,WAAaA,KAAQ,QAAU,CAAEiC,GAAM,UAAWY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,KAAO,CAAE1c,KAAQ,OAAQ0c,KAAQ,qBAAuB,CAAE1c,KAAQ,SAAU0c,KAAQ,eAAiB,CAAE1c,KAAQ,OAAQ0c,KAAQ,kBAAoB,CAAE1c,KAAQ,YAAa0c,KAAQ,kBAAoB,CAAE1c,KAAQ,UAAW0c,KAAQ,WAAaA,KAAQ,2BAA6B,CAAEiC,IAAO,UAAWY,OAAU,8BAA+BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,YAAa0c,KAAQ,OAAS,CAAE1c,KAAQ,aAAc0c,KAAQ,OAAS,CAAE1c,KAAQ,QAAS0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,OAAS,CAAE1c,KAAQ,SAAU0c,KAAQ,QAAUA,KAAQ,qBAAuB,CAAEiC,IAAO,WAAYY,OAAU,yBAA0BF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,cAAgBA,KAAQ,4BAA8B,CAAEiC,IAAO,WAAYY,OAAU,wBAAyBF,OAAU,CAAC,CAAErf,KAAQ,QAAS0c,KAAQ,WAAaA,KAAQ,yBAA2B,CAAEiC,GAAM,UAAWY,OAAU,mCAAoCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,mBAAqBA,KAAQ,iCAAmC,CAAEiC,IAAO,UAAWY,OAAU,kCAAmCF,OAAU,CAAC,CAAErf,KAAQ,OAAQ0c,KAAQ,aAAe,CAAE1c,KAAQ,SAAU0c,KAAQ,SAAWA,KAAQ,gCAAkC,CAAEiC,GAAM,UAAWY,OAAU,2BAA4BF,OAAU,CAAC,CAAErf,KAAQ,IAAK0c,KAAQ,UAAY,CAAE1c,KAAQ,SAAU0c,KAAQ,kBAAoB,CAAE1c,KAAQ,QAAS0c,KAAQ,QAAUA,KAAQ,uBAA0B+C,MAAS,KAGlvuT,SAASC,EAAWC,GAChB,MAAMtc,EAASsc,EAAMtc,OACfF,EAAM,IAAIM,MAAMJ,GACtB,IAAK,IAAI3D,EAAI,EAAGA,EAAI2D,IAAU3D,EAC1ByD,EAAIzD,IAAMigB,EAAMjgB,GAAK,GAAK,IAAM,KAAOigB,EAAMjgB,IAAM,GAAGwJ,SAAS,IAEnE,OAAO/F,EAAIqL,KAAK,IAIpB,SAASoR,EAASze,GACd,MAA2B,iBAAb,GAAoC,OAAXA,EAI3C,IAAI0e,EAAmBvgB,EAAoB,GACvCwgB,EAAwCxgB,EAAoB4B,EAAE2e,GAOlE,SAASE,EAAeJ,EAAOzW,GAI3B,OAFe4W,EAAyBjc,EAAE4V,QAAQkG,EAAOzW,EAAW,CAAEoP,GAAI,eAAa3W,GAM3F,IAAIc,EAAanD,EAAoB,GACjC0gB,EAAkC1gB,EAAoB4B,EAAEuB,GAG5D,SAASwd,EAAUrS,GAEf,OAAOA,IAAQ,EAMnB,SAASsS,EAAaC,EAAM3Q,GAExB,OADA2Q,EAAOF,EAAUE,GAAO3Q,EAAMyQ,EAAUzQ,GACjCwQ,IAAqBG,GAAMjb,UAAU,IAAItB,IAAIoc,IAAqBxQ,IAAMtG,SAAS,IA+B5F,MAAMkX,GAAanB,EAAeO,IAAIL,aAAakB,KAAKvgB,GAAqB,cAAhBA,EAAEsf,WAA2BT,GACpF2B,GAAYrB,EAAeO,IAAIL,aAAakB,KAAKvgB,GAAqB,aAAhBA,EAAEsf,WAA0BT,GAClF4B,GAAUtB,EAAeO,IAAIL,aAAakB,KAAKvgB,GAAqB,WAAhBA,EAAEsf,WAAwBT,GAC9E6B,GAAcvB,EAAeC,QAAQC,aAAakB,KAAKvgB,GAAqB,gBAAhBA,EAAEsf,WAA6BT,GAEjG,MAAM8B,EACFtD,YAAYlF,EAAU,IAClBtV,KAAK+d,UAAY,KACjB/d,KAAKiS,OAAS,EACdjS,KAAKge,SAAU,EACfhe,KAAK4Y,OAAQ,EACb5Y,KAAK+d,UAAYzI,EAAQ2I,gBAAkB,KAC3Cje,KAAKge,QAAU1I,EAAQ0I,UAAW,EAClChe,KAAKke,eAET1D,eACIxa,KAAKme,OAAS,IAAIpG,YAAY/X,KAAK+d,WACnC/d,KAAKoe,QAAU,IAAIpL,WAAWhT,KAAKme,QACnCne,KAAKqe,SAAW,IAAIpP,WAAWjP,KAAKme,QAExC3D,WACI,MAAM8D,EAAe,IAAIvG,YAAY/X,KAAKiS,QAMpCsM,EAAc,IAAIvL,WAAWsL,GAMnC,OALAC,EAAYtL,IAAIjT,KAAKoe,QAAQlL,SAAS,EAAGlT,KAAKiS,OAAS,IAKhDsM,EAEX/D,YACI,OAAOxa,KAAKwe,WAAWL,OAE3B3D,SAASiE,GAAQ,GACb,GAAIA,EAAO,CACP,MAAMH,EAAe,IAAIvG,YAAY/X,KAAKiS,QACpCyM,EAAc,IAAIzP,WAAWqP,GAEnC,OADAI,EAAYzL,IAAIjT,KAAKqe,SAASnL,SAAS,EAAGlT,KAAKiS,SACxCyM,EAEX,MAAM1B,EAAQ,IAAIlc,MAAMd,KAAKiS,QAC7B,IAAK,IAAIlV,EAAI,EAAGA,EAAIiD,KAAKiS,OAAQlV,IAC7BigB,EAAMjgB,GAAKiD,KAAKqe,SAASthB,GAE7B,OAAOigB,EAEXxC,YACI,OAAOxa,KAAKiS,OAEhBuI,YAAYmE,GACR,GAAI3e,KAAKiS,OAAS0M,EAAY3e,KAAK+d,UAC/B,OAGJ/d,KAAK+d,UAAwF,EAA5E1d,KAAKW,KAAKX,KAAKwF,IAAqB,EAAjB7F,KAAK+d,UAAe/d,KAAKiS,OAAS0M,EAAY,IAAM,GACxF,MAAMC,EAAiB5e,KAAKme,OAEtBU,EAAgB,IAAI7L,WAAW4L,GACrC5e,KAAKke,eACL,IAAIlL,WAAWhT,KAAKme,QAAQlL,IAAI4L,GAIpCrE,SAASzd,EAAG+hB,GACR9e,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAOpL,EAAEwJ,SAAS,IAAKxJ,EAAG+hB,GACpD,MAAM7M,EAASjS,KAAKiS,OAAS,EAI7B,OAHAjS,KAAKgf,YAAY,GACjBhf,KAAKoe,QAAQnM,GAAUlV,EACvBiD,KAAKiS,QAAU,EACRA,EAEXuI,SAASzd,EAAG+hB,GACR,OAAO9e,KAAKif,SAASliB,GAAI+hB,GAAS,IAAM,QAE5CtE,UAAUzd,EAAG+hB,GACL/hB,EACAiD,KAAKif,SAAStB,GAAWmB,GAAS,IAAM,SAGxC9e,KAAKif,SAASxB,GAAYqB,GAAS,IAAM,SAGjDtE,WAAW0E,EAAOC,EAAML,GACpB9e,KAAKif,SAASE,GAAOL,GAAS,IAAM,cACpC9e,KAAKif,SAASC,GAAQJ,GAAS,IAAM,eAEzCtE,UAAU4E,EAAON,GACb,GAAIhe,MAAMue,QAAQD,GACd,OAAqB,IAAjBA,EAAM1e,OACCV,KAAKsf,WAAWF,EAAM,GAAIA,EAAM,GAAIN,GAGpC9e,KAAKuf,cAAcH,EAAO,GAAIN,GAGxB,iBAAVM,IACPA,EAAQA,EAAQA,EAAM7Y,WAAa,KAEvC,MAAMvD,SAAEA,EAAQF,UAAEA,GAAcua,IAAqB+B,GAAOhZ,OAAO,YAC7DoX,EAAOxa,EAASoF,aAChByE,EAAM/J,EAAUsF,aACtBpI,KAAKif,SAASpS,GAAMiS,GAAS,IAAM,cACnC9e,KAAKif,SAASzB,GAAOsB,GAAS,IAAM,eAExCtE,YAAYrN,EAAG2R,GACX,MAAMX,EAAS,IAAIpG,YAAY,GACzBqG,EAAU,IAAIpL,WAAWmL,GACZ,IAAIqB,aAAarB,GACzB,GAAKhR,EAChBnN,KAAKif,SAASb,EAAQ,IAAKU,GAAS,IAAM,gBAC1C9e,KAAKif,SAASb,EAAQ,IAAKU,GAAS,IAAM,iBAE9CtE,YAAY3b,EAAGigB,GACX9e,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAOtJ,GAAIigB,GAAS,IAAM,gBAC1C9f,IAANH,IACAA,EAAI,IAER,MAAM4gB,EAAQC,SAASC,mBAAmB9gB,IAC1CmB,KAAKgf,YAAYS,EAAM/e,OAAS,GAChC,MAAMkf,EAAMH,EAAM/e,OACdkf,GAAO,IACP5f,KAAKqe,SAASre,KAAKiS,UAAY2N,GAG/B5f,KAAKqe,SAASre,KAAKiS,UAAY,IAC/BjS,KAAKqe,SAASre,KAAKiS,UAAkB,IAAN2N,EAC/B5f,KAAKqe,SAASre,KAAKiS,WAAmB,MAAN2N,IAAiB,EACjD5f,KAAKqe,SAASre,KAAKiS,WAAmB,SAAN2N,IAAmB,IAEvD,IAAK,IAAI7iB,EAAI,EAAGA,EAAI6iB,EAAK7iB,IACrBiD,KAAKqe,SAASre,KAAKiS,UAAYwN,EAAMtJ,WAAWpZ,GAGpD,KAAOiD,KAAKiS,OAAS,GACjBjS,KAAKqe,SAASre,KAAKiS,UAAY,EAGvCuI,WAAWwC,EAAO8B,GACV9B,aAAiBjF,YACjBiF,EAAQ,IAAI/N,WAAW+N,QAERhe,IAAVge,IACLA,EAAQ,IAEZhd,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAO4U,EAAWC,IAAS8B,GAAS,IAAM,UAEpE,MAAMc,EAAM5C,EAAMtc,OAclB,IAbAV,KAAKgf,YAAYY,EAAM,GACnBA,GAAO,IACP5f,KAAKqe,SAASre,KAAKiS,UAAY2N,GAG/B5f,KAAKqe,SAASre,KAAKiS,UAAY,IAC/BjS,KAAKqe,SAASre,KAAKiS,UAAkB,IAAN2N,EAC/B5f,KAAKqe,SAASre,KAAKiS,WAAmB,MAAN2N,IAAiB,EACjD5f,KAAKqe,SAASre,KAAKiS,WAAmB,SAAN2N,IAAmB,IAEvD5f,KAAKqe,SAASpL,IAAI+J,EAAOhd,KAAKiS,QAC9BjS,KAAKiS,QAAU2N,EAER5f,KAAKiS,OAAS,GACjBjS,KAAKqe,SAASre,KAAKiS,UAAY,EAGvCuI,cAAcwC,EAAOhV,EAAM8W,GACnB9B,aAAiBjF,cACjBiF,EAAQ,IAAI/N,WAAW+N,IAE3B,MAAM4C,EAAM5C,EAAMtc,OAClB,GAAKsH,EAAO,IAAc,EAAN4X,IAAa5X,EAAM,CACnC,MAAM6X,EAAQ,IAAI1c,MAAM,iBAAmB6E,EAAO,KAAO4X,GAEzD,MADAb,QAAQc,MAAMA,EAAO7C,EAAO8B,GACtBe,EAEV7f,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAO4U,EAAWC,IAAS8B,GAAS,IAAM,OAAS9W,GAC7EhI,KAAKgf,YAAYY,GACjB5f,KAAKqe,SAASpL,IAAI+J,EAAOhd,KAAKiS,QAC9BjS,KAAKiS,QAAU2N,EAEnBpF,cAAcwC,EAAO8B,GACb9B,aAAiBjF,cACjBiF,EAAQ,IAAI/N,WAAW+N,IAE3B,MAAM4C,EAAM5C,EAAMtc,OAClBV,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAO4U,EAAWC,GAAS8B,GAAS,IAC9D9e,KAAKgf,YAAYY,GACjB5f,KAAKqe,SAASpL,IAAI+J,EAAOhd,KAAKiS,QAC9BjS,KAAKiS,QAAU2N,EAEnBpF,YAAYsF,EAAYpD,GACpB,MACMqD,GADS/f,KAAKge,QAAU1B,EAAeC,QAAUD,EAAeO,KAC5CF,QAAQe,KAAKxgB,GAAKA,EAAE0f,SAAWkD,GACzD,IAAKC,EACD,MAAM,IAAI5c,MAAM,aAAe2c,EAAa,UAEhD9f,KAAKggB,SAASD,EAAW/D,GAAI8D,EAAa,QAC1C,MAAMG,EAASvD,EAAOuD,QAAUvD,EAC1BwD,EAAe,GAErB,IAAK,MAAMC,KAASJ,EAAWrD,OAAQ,CACnC,IAAI3C,EAAOoG,EAAMpG,KACjB,IAA2B,IAAvBA,EAAK9N,QAAQ,KAAa,CAC1B,MAAMmU,EAAWrG,EAAKhO,MAAM,KACtBsU,EAAWD,EAAS,GAAGrU,MAAM,KACnC,KAAM2Q,EAAO2D,EAAS,IAAO,IAAMA,EAAS,IAAM,CAC9C,KAAoB,SAAhBD,EAAS,GAAgBH,EAAOE,EAAM9iB,WAA+B2B,IAAvB0d,EAAOyD,EAAM9iB,OAK3D,SAHAqf,EAAO2D,EAAS,KAAO,IAAMA,EAAS,GAO9CtG,EAAOqG,EAAS,GAGpB,MAAM3c,EAASzD,KAAKsgB,YAAY5D,EAAOyD,EAAM9iB,MAAO0c,EAAM+F,EAAa,IAAMK,EAAM9iB,KAAO,KAC7E,MAAT0c,IACA2C,EAAOyD,EAAM9iB,MAAQqf,EAAOyD,EAAM9iB,OAAS,EAC3C6iB,EAAaC,EAAM9iB,MAAQoG,GAGnC,IAAK,IAAI8c,KAAaL,EAClBlgB,KAAKoe,QAAQ8B,EAAaK,IAAc7D,EAAO6D,GAEnD,OAAOR,EAAWhG,KAEtBS,YAAYS,EAAKlB,EAAM+E,GAEnB,OAAQ/E,GACJ,IAAK,IACDkB,EAAMA,GAAO,EACjB,IAAK,MACD,OAAOjb,KAAKggB,SAAS/E,EAAK6D,GAC9B,IAAK,OACD,OAAO9e,KAAKwgB,UAAUvF,EAAK6D,GAC/B,IAAK,SACD,OAAO9e,KAAKuf,cAActE,EAAK,IAAK6D,GACxC,IAAK,SACD,OAAO9e,KAAKuf,cAActE,EAAK,IAAK6D,GACxC,IAAK,SACD,OAAO9e,KAAKuf,cAActE,EAAK,IAAK6D,GACxC,IAAK,SACD,OAAO9e,KAAKygB,YAAYxF,EAAK6D,GACjC,IAAK,QACD,OAAO9e,KAAK0gB,WAAWzF,EAAK6D,GAChC,IAAK,SACD,OAAO9e,KAAK2gB,YAAY1F,EAAK6D,GACjC,IAAK,OACD,OAAO9e,KAAK4gB,UAAU3F,EAAK6D,GAC/B,IAAK,OACD,OAER,GAAIhe,MAAMue,QAAQpE,GAAM,CACpB,GAA0B,WAAtBlB,EAAK8G,OAAO,EAAG,GACf7gB,KAAKif,SAASrB,EAAQkB,EAAQ,aAE7B,GAA0B,WAAtB/E,EAAK8G,OAAO,EAAG,GACpB,MAAM,IAAI1d,MAAM,uBAAyB4W,GAE7C,MAAM+G,EAAW/G,EAAK8G,OAAO,EAAG9G,EAAKrZ,OAAS,GAC9CV,KAAKif,SAAShE,EAAIva,OAAQoe,EAAQ,WAClC,IAAK,IAAI/hB,EAAI,EAAGA,EAAIke,EAAIva,OAAQ3D,IAC5BiD,KAAKsgB,YAAYrF,EAAIle,GAAI+jB,EAAUhC,EAAQ,IAAM/hB,EAAI,KAEzD,OAAO,EAEN,GAAwC,WAApCgd,EAAK8G,OAAO,EAAG,GAAGlW,cACvB,MAAM,IAAIxH,MAAM,yBAEpB,IAAK8Z,EAAShC,GACV,MAAM,IAAI9X,MAAM,2BAA6B4W,GAEjD,MAAMgH,EAAS/gB,KAAKge,QAAU1B,EAAeC,QAAUD,EAAeO,IAChEJ,EAAYxB,EAAO,EACzB,IAAI+F,GAAS,EACb,MAAMC,EAAkBF,EAAOvE,aAAakB,KAAKvgB,GAAKA,EAAEsf,YAAcA,GAItE,IAHIuE,EAA6B,MAAnBjH,EAAKmH,OAAO,MACtBnH,EAAOA,EAAK8G,OAAO,KAElBI,EACD,MAAM,IAAI9d,MAAM,gBAAkBsZ,EAAY,UAE9CA,IAAc1C,IACdiH,GAAS,GAERA,GACDhhB,KAAKif,SAASgC,EAAgBjF,GAAI8C,EAAQ,IAAMrC,EAAY,SAEhE,MAAMwD,EAAShF,EAAIgF,OACbC,EAAe,GAErB,IAAK,MAAMC,KAASc,EAAgBvE,OAAQ,CACxC,IAAI3C,EAAOoG,EAAMpG,KAEjB,IAA2B,IAAvBA,EAAK9N,QAAQ,KAAa,CAC1B,MAAMmU,EAAWrG,EAAKhO,MAAM,KACtBsU,EAAWD,EAAS,GAAGrU,MAAM,KAEnC,KAAMkP,EAAIoF,EAAS,IAAO,IAAMA,EAAS,IAAM,CAC3C,KAAoB,SAAhBD,EAAS,GAAgBH,GAAUA,EAAOE,EAAM9iB,WAA4B2B,IAApBic,EAAIkF,EAAM9iB,OAKlE,SAHA4d,EAAIoF,EAAS,KAAO,IAAMA,EAAS,GAM3CtG,EAAOqG,EAAS,GAGpB,MAAM3c,EAASzD,KAAKsgB,YAAYrF,EAAIkF,EAAM9iB,MAAO0c,EAAM+E,EAAQ,IAAMrC,EAAY,KAAO0D,EAAM9iB,KAAO,KACxF,MAAT0c,IACAkB,EAAIkF,EAAM9iB,MAAQ4d,EAAIkF,EAAM9iB,OAAS,EACrC6iB,EAAaC,EAAM9iB,MAAQoG,GAGnC,IAAK,IAAI8c,KAAaL,EAClBlgB,KAAKoe,QAAQ8B,EAAaK,IAActF,EAAIsF,GAEhD,OAAOU,EAAgBlH,MAG/B,MAAMoH,EACF3G,YAAY2D,EAAQ7I,EAAU,IAC1BtV,KAAKiS,OAAS,EAEdjS,KAAKge,SAAU,EAEXG,aAAkBpG,aAClB/X,KAAKme,OAASA,EACdne,KAAKoe,QAAU,IAAIpL,WAAWmL,GAC9Bne,KAAKqe,SAAW,IAAIpP,WAAWjP,KAAKme,UAGpCne,KAAKme,OAASA,EAAOA,OACrBne,KAAKoe,QAAU,IAAIpL,WAAWmL,EAAOA,QACrCne,KAAKqe,SAAWF,GAGpBne,KAAKohB,SAAW9L,EAAQ8L,UAAY,GACpCphB,KAAKge,UAAY1I,EAAQ0I,QACzBhe,KAAK4Y,WAA0B5Z,IAAlBsW,EAAQsD,OAAsBtD,EAAQsD,MAKvD4B,QAAQsE,GAEJ,GAAK9e,KAAKqe,SAAS3d,OAASV,KAAKiS,OAAU,EAEvC,MADA8M,QAAQc,MAAM7f,KAAKqe,SAAUre,KAAKiS,QAC5B,IAAI9O,MAAM,qBAAuB2b,GAE3C,MAAM/hB,EAAIiD,KAAKoe,QAAQpe,KAAKiS,OAAS,GAKrC,OAHAjS,KAAK4Y,OACEmG,QAAQ5W,IAAI,MAAOpL,EAAEwJ,SAAS,IAAKxJ,EAAG+hB,EAAO9e,KAAKqe,SAASvY,MAAM9F,KAAKiS,OAAS,GAAIjS,KAAKiS,OAAS,IAAK8K,EAAW/c,KAAKqe,SAASvY,MAAM9F,KAAKiS,OAAS,GAAIjS,KAAKiS,OAAS,MAC5KjS,KAAKiS,QAAU,EACRlV,EAEXyd,SAASsE,GACL,OAAO9e,KAAKqhB,SAASvC,GAAS,IAAM,QAExCtE,YAAYsE,GACR,MAAMX,EAAS,IAAIpG,YAAY,GACzBqG,EAAU,IAAIpL,WAAWmL,GACzBmD,EAAa,IAAI9B,aAAarB,GAGpC,OAFAC,EAAQ,GAAKpe,KAAKqhB,SAASvC,GAAS,IAAM,gBACtCV,EAAQ,GAAKpe,KAAKqhB,SAASvC,GAAS,IAAM,iBACvCwC,EAAW,GAEtB9G,UAAUsE,GACN,MAAMK,EAAOnf,KAAKqhB,SAASvC,GAAS,IAAM,cAGpCyC,EAAUhE,EAFFvd,KAAKqhB,SAASvC,GAAS,IAAM,eAEPK,GACpC,IAAKnf,KAAKge,QAAS,CACf,MAAMwD,GAAOD,EACb,GAAIhW,OAAOkW,cAAcD,GAErB,OAAOA,EAIf,OAAOD,EAEX/G,UAAUsE,GACN,MAAM/hB,EAAIiD,KAAKqhB,SAASvC,GAAS,IAAM,SACvC,OAAI/hB,IAAM4gB,GAGD5gB,IAAM0gB,IAGfzd,KAAKiS,QAAU,EACRjS,KAAK0hB,YAAY,SAAU5C,IAEtCtE,YAAYsE,GACR,IAAIc,EAAM5f,KAAKqe,SAASre,KAAKiS,UACjB,MAAR2N,IACAA,EAAM5f,KAAKqe,SAASre,KAAKiS,UACpBjS,KAAKqe,SAASre,KAAKiS,WAAa,EAChCjS,KAAKqe,SAASre,KAAKiS,WAAa,IAEzC,IAQIpT,EARA4gB,EAAQ,GACZ,IAAK,IAAI1iB,EAAI,EAAGA,EAAI6iB,EAAK7iB,IACrB0iB,GAAS3V,OAAOmK,aAAajU,KAAKqe,SAASre,KAAKiS,WAGpD,KAAOjS,KAAKiS,OAAS,GACjBjS,KAAKiS,SAGT,IACIpT,EAAI8iB,mBAAmBC,OAAOnC,IAElC,MAAOhV,GACH5L,EAAI4gB,EAGR,OADAzf,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAOtJ,GAAIigB,GAAS,IAAM,WAC7CjgB,EAEX2b,WAAWsE,GACP,IAAIc,EAAM5f,KAAKqe,SAASre,KAAKiS,UACjB,MAAR2N,IACAA,EAAM5f,KAAKqe,SAASre,KAAKiS,UACpBjS,KAAKqe,SAASre,KAAKiS,WAAa,EAChCjS,KAAKqe,SAASre,KAAKiS,WAAa,IAEzC,MAAM+K,EAAQhd,KAAKqe,SAASnL,SAASlT,KAAKiS,OAAQjS,KAAKiS,OAAS2N,GAGhE,IAFA5f,KAAKiS,QAAU2N,EAER5f,KAAKiS,OAAS,GACjBjS,KAAKiS,SAGT,OADAjS,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAO4U,EAAWC,IAAS8B,GAAS,IAAM,UAC7D9B,EAEXxC,cAAcxS,EAAMyW,GAAQ,EAAMK,GAC9B,GAAI9W,EAAO,GACP,MAAM,IAAI7E,MAAM,iBAAmB6E,GAEvC,MAAM4X,EAAM5X,EAAO,EACnB,GAAIyW,EAAO,CACP,MAAMhb,EAASzD,KAAKqe,SAASnL,SAASlT,KAAKiS,OAAQjS,KAAKiS,OAAS2N,GAEjE,OADA5f,KAAKiS,QAAU2N,EACRnc,EAEX,MAAMuZ,EAAQ,IAAIlc,MAAM8e,GACxB,IAAK,IAAI7iB,EAAI,EAAGA,EAAI6iB,EAAK7iB,IACrBigB,EAAMjgB,GAAKiD,KAAKqe,SAASre,KAAKiS,UAGlC,OADAjS,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAO4U,EAAWC,IAAS8B,GAAS,IAAM,OAAS9W,GACtEgV,EAEXxC,cAAcoF,EAAKnB,GAAQ,EAAMK,GAC7B,IAAY,IAARc,IACAA,EAAM5f,KAAKqhB,SAASvC,GAAS,IAAM,YACzB9e,KAAKqe,SAASzG,WACpB,MAAM,IAAIzU,MAAM,6BAA+Byc,EAAM,iBAAmB5f,KAAKqe,SAASzG,YAG9F,GAAI6G,EAAO,CACP,MAAMzB,EAAQ,IAAI/N,WAAW2Q,GAG7B,OAFA5C,EAAM/J,IAAIjT,KAAKqe,SAASnL,SAASlT,KAAKiS,OAAQjS,KAAKiS,OAAS2N,IAC5D5f,KAAKiS,QAAU2N,EACR5C,EAEX,MAAMA,EAAQ,IAAIlc,MAAM8e,GACxB,IAAK,IAAI7iB,EAAI,EAAGA,EAAI6iB,EAAK7iB,IACrBigB,EAAMjgB,GAAKiD,KAAKqe,SAASre,KAAKiS,UAGlC,OADAjS,KAAK4Y,OAASmG,QAAQ5W,IAAI,MAAO4U,EAAWC,GAAS8B,GAAS,IACvD9B,EAEXxC,YAAYT,EAAM+E,GACd,MAAMc,EAAM5f,KAAKqhB,QAAQvC,EAAQ,WAC3Brb,EAAS,IAAI3C,MAAM8e,GACzB,GAAIA,EAAM,EAAG,CACT,MAAMkB,EAAW/G,EAAK8G,OAAO,EAAG9G,EAAKrZ,OAAS,GAC9C,IAAK,IAAI3D,EAAI,EAAGA,EAAI6iB,IAAO7iB,EACvB0G,EAAO1G,GAAKiD,KAAK0hB,YAAYZ,EAAUhC,EAAQ,IAAM/hB,EAAI,KAGjE,OAAO0G,EAEX+W,YAAYT,EAAM+E,GACd,OAAQ/E,GACJ,IAAK,IACL,IAAK,MACD,OAAO/Z,KAAK6hB,SAAS/C,GACzB,IAAK,OACD,OAAO9e,KAAK8hB,UAAUhD,GAC1B,IAAK,SACD,OAAO9e,KAAK+hB,cAAc,KAAK,EAAMjD,GACzC,IAAK,SACD,OAAO9e,KAAK+hB,cAAc,KAAK,EAAMjD,GACzC,IAAK,SACD,OAAO9e,KAAK+hB,cAAc,KAAK,EAAMjD,GACzC,IAAK,SACD,OAAO9e,KAAKgiB,YAAYlD,GAC5B,IAAK,QACD,OAAO9e,KAAKiiB,WAAWnD,GAC3B,IAAK,SACD,OAAO9e,KAAKkiB,YAAYpD,GAC5B,IAAK,OACD,OAAO9e,KAAKmiB,UAAUrD,GAC1B,IAAK,OACD,OAAO,EAGf,GADAA,EAAQA,GAAS/E,GAAQ,SACF,MAAnBA,EAAKmH,OAAO,IAAoC,UAAtBnH,EAAK8G,OAAO,EAAG,GACzC,OAAO7gB,KAAKoiB,YAAYrI,EAAM+E,GAElC,MAAMiC,EAAS/gB,KAAKge,QAAU1B,EAAeC,QAAUD,EAAeO,IACtE,IAAIoE,EAAkB,KAClBoB,GAAW,EACf,GAAuB,MAAnBtI,EAAKmH,OAAO,GAAY,CACxB,MAAMoB,EAAYvI,EAAK8G,OAAO,GAE9B,GADAI,EAAkBF,EAAOvE,aAAakB,KAAKvgB,GAAKA,EAAE4c,OAASuI,IACtDrB,EACD,MAAM,IAAI9d,MAAM,mCAAqC4W,OAQxD,CACD,MAAMwI,EAAiBviB,KAAKqhB,QAAQvC,EAAQ,QAC5C,GAAIyD,IAAmB1E,EAAY,CAC/B,MACM2E,EAAepF,EADFpd,KAAKiiB,WAAWnD,EAAQ,oBAG3C,OADwB,IAAIqC,EAA2BqB,GAChCd,YAAY3H,EAAM+E,GAE7C,GAAIyD,IAAmB3E,EACnB,OAAO5d,KAAKoiB,YAAYrI,EAAM+E,GAElC,IAAI2D,EAAQ1B,EAAO2B,kBACnB,IAAKD,EAAO,CACR1B,EAAO2B,kBAAoBD,EAAQ,GACnC,IAAK,IAAI1lB,EAAI,EAAG6iB,EAAMmB,EAAOvE,aAAa9b,OAAQ3D,EAAI6iB,EAAK7iB,IACvD0lB,EAAM1B,EAAOvE,aAAazf,GAAGif,IAAMjf,EAG3C,MAAMA,EAAI0lB,EAAMF,GAIhB,QAHUvjB,IAANjC,IACAkkB,EAAkBF,EAAOvE,aAAazf,KAErCkkB,GAAmBjhB,KAAKge,QAAS,CAClC,MAAM2E,EAAiBrG,EAAeO,IACtC,IAAK,IAAI9f,EAAI,EAAG6iB,EAAM+C,EAAenG,aAAa9b,OAAQ3D,EAAI6iB,EAAK7iB,IAC/D,IAAK4lB,EAAenG,aAAazf,GAAGif,KAAOuG,EAAgB,CACvDtB,EAAkB0B,EAAenG,aAAazf,UACvCiD,KAAKge,QACZqE,GAAW,EACX,OAIZ,IAAKpB,EAAiB,CAElB,IAAI2B,EAAMC,EADV9D,QAAQc,MAAM,yBAA0B0C,GAExC,IACIK,EAAO5iB,KAAK6hB,SAAS/C,GACrB+D,EAAO7iB,KAAK6hB,SAAS/C,GAEzB,MAAOjJ,IAEP,MAAM,IAAI1S,MAAM,0BAA4Bof,EAAiB,IAAMK,EAAO,IAAMC,EAAO,IAAM/D,IAGrG,MAAMrC,EAAYwE,EAAgBxE,UAC5BhZ,EAAS,CAAE+J,EAAKiP,GAChBqG,GAAe9iB,KAAKge,QAAU,MAAQ,IAAMvB,EAClD,GAAIzc,KAAKohB,SAAS0B,GACd9iB,KAAKohB,SAAS0B,GAAarf,EAAQqb,EAAQ,IAAMrC,EAAY,UAG7D,IAAK,IAAI1f,EAAI,EAAG6iB,EAAMqB,EAAgBvE,OAAOhc,OAAQ3D,EAAI6iB,EAAK7iB,IAAK,CAC/D,MAAMojB,EAAQc,EAAgBvE,OAAO3f,GACrC,IAAIgd,EAAOoG,EAAMpG,KACJ,MAATA,QAAkC/a,IAAlByE,EAAOwc,SACvBxc,EAAOwc,OAAS,IAEpB,MAAM8C,GAAiC,IAAvBhJ,EAAK9N,QAAQ,KAC7B,GAAI8W,EAAQ,CACR,MAAM3C,EAAWrG,EAAKhO,MAAM,KACtBsU,EAAWD,EAAS,GAAGrU,MAAM,KACnC,KAAMtI,EAAO4c,EAAS,IAAO,IAAMA,EAAS,IAExC,SAGJtG,EAAOqG,EAAS,GAEpB,MAAMriB,EAAQiC,KAAK0hB,YAAY3H,EAAM+E,EAAQ,IAAMrC,EAAY,KAAO0D,EAAM9iB,KAAO,KAC/E0lB,GAAmB,SAAThJ,EACVtW,EAAOwc,OAAOE,EAAM9iB,MAAQU,EAM5B0F,EAAO0c,EAAM9iB,MAAQU,EAOjC,OAHIskB,IACAriB,KAAKge,SAAU,GAEN,cAATjE,EACO/Z,KAAKgjB,gBAAgBvf,GAEzBA,EAEX+W,gBAAgByI,GACZ,IAAKA,EAAUzV,EACX,OAAOyV,EACX,OAAQA,EAAUzV,GACd,IAAK,WACD,OAAO,KACX,IAAK,aAAc,CACf,MAAMhC,EAAM,GACN0X,EAAeD,EAAUllB,MAC/B,IAAK,IAAIhB,EAAI,EAAG2D,EAASwiB,EAAaxiB,OAAQ3D,EAAI2D,IAAU3D,EAAG,CAC3D,MAAMomB,EAAcD,EAAanmB,GACjCyO,EAAI2X,EAAY9kB,KAAO2B,KAAKgjB,gBAAgBG,EAAYplB,OAE5D,OAAOyN,EAEX,QACI,OAAOyX,EAAUllB,OAG7Byc,YACI,OAAOxa,KAAKiS,OAEhBuI,UAAUvI,GACNjS,KAAKiS,OAASA,GAGtBmH,EAAegK,kBAAoBjC,EACnC/H,EAAeiK,gBAAkBvF,EAiBjC,SAASwF,EAAgBtG,EAAOxb,EAAO,KACnC,OAAO6b,EAAmBnc,EAAE+L,UAAU+P,aAAiB/N,WAAa,IAAI+N,GAASA,EAAOxb,GAE5F,SAAS+hB,EAAcxkB,GACnB,OAAO,IAAIkQ,WAAWlQ,EAAOqN,QAAQ,KAAKrO,OAK9C,SAASylB,EAAYxG,EAAOpW,EAAKtC,GAC7B,MAAMmf,EAAcH,EAAgBtG,GAC9B0G,EAAYJ,EAAgB1c,GAC5B+c,EAAYL,EAAgBhf,GAElC,OAAOif,EADWE,EAAYte,OAAOue,EAAWC,IAKpD,SAASC,EAAUpjB,GACf,IAAIqjB,UAAU,oBAAqBA,QAI/B,MAAM,IAAI1gB,MAAM,oBAEpB,OALI0gB,OAAOC,gBAAgBtjB,GAKpBA,EAMX,SAASujB,EAAW/G,EAAOgH,EAAY,GAAIC,EAAQC,GAAyB,EAAOC,GAAU,GACzF,MAAMvE,EAAM5C,EAAMpF,YAAcoF,EAAMtc,OAChC0jB,EAAcF,EAAyBF,EAAYpE,EAAMoE,EAAapE,EAAMoE,EAClF,GAAII,EAAc,GAAKA,EAAcJ,EAAW,CAE5C,MAAMK,EAAU,IAAIpV,WAAWmV,GAC/B,GAAIH,EACA,IAAK,IAAIlnB,EAAI,EAAGA,EAAIqnB,IAAernB,EAC/BsnB,EAAQtnB,GAAK,OAIjB6mB,EAAUS,GAEd,OAAIrH,aAAiBjF,aACToM,EAAU3M,EAAc6M,EAASrH,GAASxF,EAAcwF,EAAOqH,IAAUlG,OAE5EnB,aAAiB/N,WACdkV,EAAU3M,EAAc6M,EAASrH,GAASxF,EAAcwF,EAAOqH,GAI/DF,EAAU,IAAIE,GAAS7hB,OAAOwa,GAASA,EAAMxa,OAAO,IAAI6hB,IAGxE,OAAOrH,EAIX,SAASsH,EAASC,EAAQC,GACtB,MAAM5E,EAAM2E,EAAO7jB,OACbsc,EAAQ,IAAI/N,WAAW2Q,GAC7B,IAAK,IAAI7iB,EAAI,EAAGA,EAAI6iB,IAAO7iB,EACvBigB,EAAMjgB,GAAKwnB,EAAOxnB,GAAKynB,EAAOznB,GAElC,OAAOigB,EAIX,SAASyH,EAAoBzH,GACzB,OAAIA,aAAiB/N,WACV+N,EAEiB,iBAAZ,GACL,IAAI0H,aAAcC,OAAO3H,GAE7B,IAAI/N,WAAW+N,GAS1B,IAAI4H,EAAkD,SAAUC,EAASC,EAAYvR,EAAGwR,GAEpF,OAAO,IAAKxR,IAAMA,EAAI0E,WAAU,SAAUI,EAASG,GAC/C,SAASwM,EAAUjnB,GAAS,IAAMknB,EAAKF,EAAU7f,KAAKnH,IAAW,MAAO0M,GAAK+N,EAAO/N,IACpF,SAASya,EAASnnB,GAAS,IAAMknB,EAAKF,EAAiB,MAAEhnB,IAAW,MAAO0M,GAAK+N,EAAO/N,IACvF,SAASwa,EAAKxhB,GAJlB,IAAe1F,EAIa0F,EAAOmQ,KAAOyE,EAAQ5U,EAAO1F,QAJ1CA,EAIyD0F,EAAO1F,MAJhDA,aAAiBwV,EAAIxV,EAAQ,IAAIwV,GAAE,SAAU8E,GAAWA,EAAQta,OAITua,KAAK0M,EAAWE,GAClGD,GAAMF,EAAYA,EAAU5Z,MAAM0Z,EAASC,GAAc,KAAK5f,YAuBtE,SAASigB,EAAWC,EAAUvX,EAAOwX,GACjC,OAAOT,EAAU5kB,UAAM,OAAQ,GAAQ,YACnC,MAAMslB,EAAQD,EAAQxX,EAAM0X,SAAW1X,EAAM2X,aACvC5mB,EAAI0kB,EAAgBgC,EAAK1mB,GACzB6O,EAAI4P,IAAqBiI,EAAK7X,GAkB9BgY,QAlCd,SAA0BL,EAAUM,EAAaC,GAC7C,OAAOf,EAAU5kB,UAAM,OAAQ,GAAQ,YAEnC,IAAIme,QAAeyH,GAAaC,aAAa,SAAUrO,EAAckO,GAAa,IAAIhB,aAAcC,OAAOS,GAAWM,IACtHvH,EAAS3G,EAAcmO,EAAaxH,EAAQwH,GAC5CxH,QAAeyH,GAAaC,aAAa,SAAU1H,GACnD,IAAI2H,QAAaF,GAAaC,aAAa,SAAU,IAAI5W,WAAWkP,GAASuH,EAAa,KAG1F,OAFAI,EAAOtO,EAAcmO,EAAaG,EAAMH,GACxCxH,QAAeyH,GAAaC,aAAa,SAAUC,GAC5C3H,KAyBe4H,CAAiBX,EAAUE,EAAKU,MAAOV,EAAKW,OAC5DplB,EAAIwc,IAAqBN,EAAW0I,GAAU,IAC9CS,EAAW,SAAU1lB,EAAKof,GAI5B,OAHMpf,aAAeyO,aACjBzO,EAAMikB,EAAoBjkB,IAEvBujB,EAAWvjB,EAAKof,GAAK,GAAM,GAAM,IAEtCpgB,EAAIiO,EAAEtI,OAAOtE,EAAGjC,GAChBunB,EAAW3lB,IACb,MAAMgL,EAAM,IAAIyD,WAAWzO,EAAIE,QAC/B,IAAK,IAAI3D,EAAI,EAAGA,EAAIyD,EAAIE,OAAQ3D,GAAK,EACjCyO,EAAIzO,GAAKyD,EAAIzD,EAAI,GACjByO,EAAIzO,EAAI,GAAKyD,EAAIzD,EAAI,GACrByO,EAAIzO,EAAI,GAAKyD,EAAIzD,EAAI,GACrByO,EAAIzO,EAAI,GAAKyD,EAAIzD,GAErB,OAAOyO,GAGX,GAAI6Z,EAAO,CAEP,OAAOa,EADO3C,EAAc/jB,GACyC,KAEzE,MAAMiQ,EAAI6T,EAAgBzV,EAAMuY,OAC1BC,EAAWH,EAAS3C,EAAc3kB,GAAI,KACtC0nB,EAAWJ,EAAS3C,EAAc9V,GAAI,KACtC8Y,EAAaL,EAAS3C,EAAc9T,GAAI,KAGxC+W,EADIlD,QADUsC,GAAaC,aAAa,SAAUrO,EAAc6O,EAAUC,KAElE9gB,SAAShG,GAAG8E,IAAI1F,GACxB6nB,EAAwB,CAACC,EAAQC,KACnC,MAAMC,EAAOD,EAAM/kB,SAAS8kB,GAG5B,QAAIE,EAAKjgB,cACLigB,EAAK3e,YAAYG,aAHO,MAIxBse,EAAOze,YAAYG,aAJK,MAKxB/H,KAAKC,OAAOomB,EAAOze,YAAYG,aAAe,GAAK,GAJ9B,OAuBvBlH,EAAEA,EAAC2lB,WAAEA,EAAUxZ,EAAEA,QAfW,KAAMuX,EAAU5kB,UAAM,OAAQ,GAAQ,YACpE,OAAa,CACT,MAAMkB,EAAIoiB,EAAgB6C,EAAQtY,EAAMiZ,gBAElClZ,EAAIH,EAAEtI,OAAOjE,EAAGtC,GACtB,GAAI6nB,EAAsB7Y,EAAGhP,GAAI,CAC7B,MAAMioB,EAAatD,EAAc3V,GAG3BP,EAAIiW,QAFMsC,GAAaC,aAAa,SAAUrO,EAAcqP,EAAYN,KAG9E,IAAKlZ,EAAExG,WAAawG,EAAE1G,aAClB,MAAO,CAAEzF,IAAG2lB,aAAYxZ,UAIL0Z,GACnC,IAAIC,EAKAA,EAJCvX,EAAElI,QAAQif,GAIL/W,EAHAA,EAAExO,IAAIrC,GAIhBooB,EAAMA,EAAIplB,SAAS4kB,GAAKliB,IAAI1F,GAC5B,MAAMqoB,EAAK5Z,EAAE7H,SAAS3E,GAChBqmB,EAAOhmB,EAAED,IAAIgmB,GACb9X,EAAI6X,EAAI7hB,OAAO+hB,EAAMtoB,GACrB0U,QAAUsS,GAAaC,aAAa,SAAUK,EAAS3C,EAAcpU,GAAI,MAC/E,IAAIgY,QAAWvB,GAAaC,aAAa,SAAUQ,GAEnDc,EAAK7C,EAAS6C,QADGvB,GAAaC,aAAa,SAAUS,IAErD,MAAMc,EAAO5P,EAAc2P,QAAUvB,GAAaC,aAAa,SAAUP,EAAKU,aAAcJ,GAAaC,aAAa,SAAUP,EAAKW,OAAQY,EAAYN,EAAYjT,GAC/J+T,QAAWzB,GAAaC,aAAa,SAAUuB,GAOrD,MANY,CACR5Z,EAAG,wBACH8Z,OAAQzZ,EAAMyZ,OACd1Z,EAAG,IAAIqB,WAAW4X,GAClBQ,SAOZ,IAAIE,EAAQ,IAAItY,WAAW,KACvBuY,EAAK,IAAIvY,WAAW,KACpBwY,EAAK,IAAIva,YAAY,KACrBwa,EAAK,IAAIxa,YAAY,KACrBya,EAAK,IAAIza,YAAY,KACrB0a,EAAK,IAAI1a,YAAY,KACrB2a,EAAK,IAAI3a,YAAY,KACrB4a,EAAK,IAAI5a,YAAY,KACrB6a,GAAK,IAAI7a,YAAY,KACrB8a,GAAK,IAAI9a,YAAY,KAqDzB,SAAS+a,GAAS5pB,GACd,GAAIA,aAAe6O,YACf,OAAO7O,EAEX,GAAmB,iBAARA,EAAkB,CACzB,GAAIA,EAAIqC,OAAS,GAAM,EACnB,IAAK,IAAI3D,EAAIsB,EAAIqC,OAAS,EAAG3D,GAAK,EAAGA,IACjCsB,GAAO,QACf,IAAI6pB,EAAM,IAAIhb,YAAY7O,EAAIqC,OAAS,GACvC,IAAS3D,EAAI,EAAGA,EAAIsB,EAAIqC,OAAQ3D,GAAK,EACjCmrB,EAAInrB,EAAI,IArBForB,EAqBgBprB,GArBrBsP,EAqBgBhO,GApBb8X,WAAWgS,IAAQ,GACzB9b,EAAI8J,WAAWgS,EAAM,IAAM,GAC3B9b,EAAI8J,WAAWgS,EAAM,IAAM,EAC3B9b,EAAI8J,WAAWgS,EAAM,IAkBvB,OAAOD,EAtBf,IAAa7b,EAAK8b,EAwBd,GAAI9pB,aAAe4Q,WAAY,CAE3B,IADIiZ,EAAM,IAAIhb,YAAY7O,EAAIqC,OAAS,GAC9B3D,EAAI,EAAGA,EAAIsB,EAAIqC,OAAQ3D,GAAK,EACjCmrB,EAAInrB,EAAI,GAAMsB,EAAItB,IAAM,GAClBsB,EAAItB,EAAI,IAAM,GACdsB,EAAItB,EAAI,IAAM,EACdsB,EAAItB,EAAI,GAElB,OAAOmrB,EAEX,MAAM,IAAI/kB,MAAM,iCAEpB,SAASgH,GAAIsB,EAAM2c,EAAOzS,QACX,IAAPA,IAAiBA,EAAKlK,GAC1B,IAAK,IAAI1O,EAAI,EAAGA,EAAI0O,EAAK/K,OAAQ3D,IAC7B4Y,EAAG5Y,GAAK0O,EAAK1O,GAAKqrB,EAAMrrB,IAhFhC,WAYI,IAXA,IAEIsrB,EACAC,EAEAzpB,EACA0pB,EACAC,EAPAprB,EAAI,IAAI6R,WAAW,KACnBjR,EAAI,IAAIiR,WAAW,KAOnBpO,EAAI,EACJ4nB,EAAO,EAEF1rB,EAAI,EAAGA,EAAI,IAAKA,IACrBK,EAAEL,GAAKA,GAAK,EAAe,KAAVA,GAAK,GACtBiB,EAAEZ,EAAEL,GAAKA,GAAKA,EAElB,MAAQwqB,EAAM1mB,GAAIA,GAAKwnB,GAAM,EAGzBxpB,GADAA,EAAI4pB,EAAOA,GAAQ,EAAIA,GAAQ,EAAIA,GAAQ,EAAIA,GAAQ,IAC9C,EAAQ,IAAJ5pB,EAAU,GACvB0oB,EAAM1mB,GAAKhC,EACX2oB,EAAG3oB,GAAKgC,EAGR2nB,EAAY,SADPprB,EAAEkrB,EAAKlrB,EAAEirB,EAAKjrB,EAAEyD,KACQ,MAALynB,EAAoB,IAALD,EAAiB,SAAJxnB,EACpD0nB,EAAc,IAAPnrB,EAAEyB,GAAiB,SAAJA,EACtB4oB,EAAG5mB,GAAK0nB,EAAOA,GAAQ,GAAKA,IAAS,EACrCb,EAAG7mB,GAAK0nB,EAAOA,GAAQ,GAAKA,IAAS,EACrCZ,EAAG9mB,GAAK0nB,EAAOA,GAAQ,GAAKA,IAAS,EACrCX,EAAG/mB,GAAK0nB,EAAOA,GAAQ,GAAKA,IAAS,EACrCV,EAAGhpB,GAAK2pB,EAAOA,GAAQ,GAAKA,IAAS,EACrCV,EAAGjpB,GAAK2pB,EAAOA,GAAQ,GAAKA,IAAS,EACrCT,GAAGlpB,GAAK2pB,EAAOA,GAAQ,GAAKA,IAAS,EACrCR,GAAGnpB,GAAK2pB,EAAOA,GAAQ,GAAKA,IAAS,EACrCC,EAAOzqB,EAAEyqB,IAAS,EAiD1BC,GAIA,IAAIC,GAAqB,WACrB,SAASA,EAAIC,GACT,IAAIvqB,EAAM4pB,GAASW,GACnB,GAAmB,IAAfvqB,EAAIqC,QAA+B,IAAfrC,EAAIqC,QAA+B,IAAfrC,EAAIqC,OAC5C,MAAM,IAAIyC,MAAM,oBAEpBnD,KAAK6oB,OAAS,IAAI3b,YAAY,EAAI7O,EAAIqC,OAAS,IAC/CV,KAAK8oB,OAAS,IAAI5b,YAAY,EAAI7O,EAAIqC,OAAS,IAC/CV,KAAK6oB,OAAO5V,IAAI5U,GAKhB,IAJA,IAEImM,EAFAue,EAAO,EACPhsB,EAAIsB,EAAIqC,OAGL3D,EAAI,EAAIsB,EAAIqC,OAAS,GAAI3D,IAC5ByN,EAAMxK,KAAK6oB,OAAO9rB,EAAI,IAElBA,EAAIsB,EAAIqC,QAAW,GAAqB,IAAfrC,EAAIqC,QAAgB3D,EAAIsB,EAAIqC,QAAW,KAChE8J,EAAM+c,EAAM/c,IAAQ,KAAO,GAAK+c,EAAO/c,GAAO,GAAM,MAAQ,GAAK+c,EAAO/c,GAAO,EAAK,MAAQ,EAAI+c,EAAY,IAAN/c,GAElGzN,EAAIsB,EAAIqC,QAAW,IACnB8J,EAAMA,GAAO,EAAIA,IAAQ,GAAMue,GAAQ,GACvCA,EAAOA,GAAQ,EAAkB,KAAbA,GAAQ,KAGpC/oB,KAAK6oB,OAAO9rB,GAAKiD,KAAK6oB,OAAO9rB,EAAIsB,EAAIqC,QAAU8J,EAGnD,IAAK,IAAInI,EAAI,EAAGtF,EAAGsF,IAAKtF,IACpByN,EAAMxK,KAAK6oB,OAAW,EAAJxmB,EAAQtF,EAAIA,EAAI,GAE9BiD,KAAK8oB,OAAOzmB,GADZtF,GAAK,GAAKsF,EAAI,EACGmI,EAGCqd,EAAGN,EAAM/c,IAAQ,KAC7Bsd,EAAGP,EAAO/c,GAAO,GAAM,MACvBud,GAAGR,EAAO/c,GAAO,EAAK,MACtBwd,GAAGT,EAAY,IAAN/c,IAiF3B,OA7EAme,EAAIjqB,UAAUsqB,QAAU,SAAUC,GAa9B,IAZA,IAQIC,EACAC,EACAC,EAVAC,EAAUpB,GAASgB,GACnBzd,EAAM,IAAI0B,YAAY,GACtBhM,EAAImoB,EAAQ,GAAKrpB,KAAK6oB,OAAO,GAC7B1nB,EAAIkoB,EAAQ,GAAKrpB,KAAK6oB,OAAO,GAC7B1rB,EAAIksB,EAAQ,GAAKrpB,KAAK6oB,OAAO,GAC7BzrB,EAAIisB,EAAQ,GAAKrpB,KAAK6oB,OAAO,GAC7BS,EAAStpB,KAAK6oB,OAAOnoB,OAAS,EAAI,EAClC6M,EAAI,EAKCxQ,EAAI,EAAGA,EAAIusB,EAAQvsB,IACxBmsB,EAAKzB,EAAGvmB,IAAM,IAAMwmB,EAAIvmB,GAAK,GAAM,KAAOwmB,EAAIxqB,GAAK,EAAK,KAAOyqB,EAAO,IAAJxqB,GAAW4C,KAAK6oB,OAAOtb,GACzF4b,EAAK1B,EAAGtmB,IAAM,IAAMumB,EAAIvqB,GAAK,GAAM,KAAOwqB,EAAIvqB,GAAK,EAAK,KAAOwqB,EAAO,IAAJ1mB,GAAWlB,KAAK6oB,OAAOtb,EAAI,GAC7F6b,EAAK3B,EAAGtqB,IAAM,IAAMuqB,EAAItqB,GAAK,GAAM,KAAOuqB,EAAIzmB,GAAK,EAAK,KAAO0mB,EAAO,IAAJzmB,GAAWnB,KAAK6oB,OAAOtb,EAAI,GAC7FnQ,EAAIqqB,EAAGrqB,IAAM,IAAMsqB,EAAIxmB,GAAK,GAAM,KAAOymB,EAAIxmB,GAAK,EAAK,KAAOymB,EAAO,IAAJzqB,GAAW6C,KAAK6oB,OAAOtb,EAAI,GAC5FrM,EAAIgoB,EACJ/nB,EAAIgoB,EACJhsB,EAAIisB,EACJ7b,GAAK,EAIT,IAASxQ,EAAI,EAAGA,EAAI,EAAGA,IACnByO,EAAIzO,GAAMwqB,EAAMrmB,IAAM,KAAO,GACvBqmB,EAAOpmB,GAAK,GAAM,MAAQ,GAC1BomB,EAAOpqB,GAAK,EAAK,MAAQ,EACzBoqB,EAAU,IAAJnqB,GACN4C,KAAK6oB,OAAOtb,KAClB2b,EAAKhoB,EACLA,EAAIC,EACJA,EAAIhE,EACJA,EAAIC,EACJA,EAAI8rB,EAER,OAAO1d,GAEXmd,EAAIjqB,UAAU6qB,QAAU,SAAUN,GAa9B,IAZA,IAOIC,EACAC,EACAC,EATAC,EAAUpB,GAASgB,GACnBzd,EAAM,IAAI0B,YAAY,GACtBhM,EAAImoB,EAAQ,GAAKrpB,KAAK8oB,OAAO,GAC7B3nB,EAAIkoB,EAAQ,GAAKrpB,KAAK8oB,OAAO,GAC7B3rB,EAAIksB,EAAQ,GAAKrpB,KAAK8oB,OAAO,GAC7B1rB,EAAIisB,EAAQ,GAAKrpB,KAAK8oB,OAAO,GAC7BQ,EAAStpB,KAAK8oB,OAAOpoB,OAAS,EAAI,EAIlC6M,EAAI,EAECxQ,EAAI,EAAGA,EAAIusB,EAAQvsB,IACxBmsB,EAAKrB,EAAG3mB,IAAM,IAAM4mB,EAAI3mB,GAAK,GAAM,KAAO4mB,GAAI5qB,GAAK,EAAK,KAAO6qB,GAAO,IAAJ5qB,GAAW4C,KAAK8oB,OAAOvb,GACzF4b,EAAKtB,EAAG1mB,IAAM,IAAM2mB,EAAI3qB,GAAK,GAAM,KAAO4qB,GAAI3qB,GAAK,EAAK,KAAO4qB,GAAO,IAAJ9mB,GAAWlB,KAAK8oB,OAAOvb,EAAI,GAC7F6b,EAAKvB,EAAG1qB,IAAM,IAAM2qB,EAAI1qB,GAAK,GAAM,KAAO2qB,GAAI7mB,GAAK,EAAK,KAAO8mB,GAAO,IAAJ7mB,GAAWnB,KAAK8oB,OAAOvb,EAAI,GAC7FnQ,EAAIyqB,EAAGzqB,IAAM,IAAM0qB,EAAI5mB,GAAK,GAAM,KAAO6mB,GAAI5mB,GAAK,EAAK,KAAO6mB,GAAO,IAAJ7qB,GAAW6C,KAAK8oB,OAAOvb,EAAI,GAC5FrM,EAAIgoB,EACJ/nB,EAAIgoB,EACJhsB,EAAIisB,EACJ7b,GAAK,EAGT,IAASxQ,EAAI,EAAGA,EAAI,EAAGA,IACnByO,EAAI,GAAKzO,GAAMyqB,EAAGtmB,IAAM,KAAO,GACzBsmB,EAAIrmB,GAAK,GAAM,MAAQ,GACvBqmB,EAAIrqB,GAAK,EAAK,MAAQ,EACtBqqB,EAAO,IAAJpqB,GACH4C,KAAK8oB,OAAOvb,KAClB2b,EAAKhoB,EACLA,EAAIC,EACJA,EAAIhE,EACJA,EAAIC,EACJA,EAAI8rB,EAER,OAAO1d,GAEJmd,EArHa,GA2HpBa,GAAyB,WACzB,SAASA,EAAQnrB,EAAKorB,EAAIzF,QACJ,IAAdA,IAAwBA,EAAY,IACxChkB,KAAK3B,IAAM4pB,GAAS5pB,GACpB2B,KAAKypB,GAAKxB,GAASwB,GACnBzpB,KAAK0pB,OAAS,IAAIf,GAAItqB,GACtB2B,KAAKgkB,UAAYA,EAAY,EA4CjC,OAvCAwF,EAAQ9qB,UAAUsqB,QAAU,SAAUK,EAASnB,GAM3C,IALA,IAAIxd,EAAOud,GAASoB,GAChBM,EAAazB,GAAO,IAAIhb,YAAYxC,EAAKhK,QACzCkpB,EAAQ5pB,KAAKypB,GAAGvW,SAASlT,KAAKgkB,UAAWhkB,KAAKypB,GAAG/oB,QACjDmpB,EAAQ7pB,KAAKypB,GAAGvW,SAAS,EAAGlT,KAAKgkB,WACjC8F,EAAO,IAAI5c,YAAYlN,KAAKgkB,WACvBjnB,EAAI,EAAGA,EAAI2N,EAAKhK,OAAQ3D,GAAKiD,KAAKgkB,UAAW,CAClD,IAAInjB,EAAI6J,EAAKwI,SAASnW,EAAGA,EAAIiD,KAAKgkB,WAClC7Z,GAAItJ,EAAGgpB,EAAOC,GACd,IAAIlkB,EAAI5F,KAAK0pB,OAAOV,QAAQc,GAC5B3f,GAAIvE,EAAGgkB,GACPA,EAAQ/oB,EACRgpB,EAAQjkB,EACR,IAAK,IAAIvD,EAAItF,EAAGwQ,EAAI,EAAGlL,EAAIqI,EAAKhK,QAAU6M,EAAI,EAAGlL,IAAKkL,IAClDoc,EAAWtnB,GAAKuD,EAAE2H,GAE1B,OAAOoc,GAKXH,EAAQ9qB,UAAU6qB,QAAU,SAAUF,EAASnB,GAM3C,IALA,IAAIyB,EAAa1B,GAASoB,GACtB3e,EAAOwd,GAAO,IAAIhb,YAAYyc,EAAWjpB,QACzCmpB,EAAQ7pB,KAAKypB,GAAGvW,SAASlT,KAAKgkB,UAAWhkB,KAAKypB,GAAG/oB,QACjDkpB,EAAQ5pB,KAAKypB,GAAGvW,SAAS,EAAGlT,KAAKgkB,WACjC8F,EAAO,IAAI5c,YAAYlN,KAAKgkB,WACvBjnB,EAAI,EAAGA,EAAI2N,EAAKhK,OAAQ3D,GAAKiD,KAAKgkB,UAAW,CAClD,IAAInjB,EAAI8oB,EAAWzW,SAASnW,EAAGA,EAAIiD,KAAKgkB,WACxC7Z,GAAItJ,EAAGgpB,EAAOC,GACd,IAAIlkB,EAAI5F,KAAK0pB,OAAOH,QAAQO,GAC5B3f,GAAIvE,EAAGgkB,GACPA,EAAQ/oB,EACRgpB,EAAQjkB,EACR,IAAK,IAAIvD,EAAItF,EAAGwQ,EAAI,EAAGlL,EAAIqI,EAAKhK,QAAU6M,EAAI,EAAGlL,IAAKkL,IAClD7C,EAAKrI,GAAKuD,EAAE2H,GAEpB,OAAO7C,GAEJ8e,EAlDiB,GAyGKO,IAjDF,WAC3B,SAASP,EAAQnrB,EAAK2rB,EAAShG,GAO3B,QANkB,IAAdA,IAAwBA,EAAY,IACxChkB,KAAKiS,OAAS,EACdjS,KAAK3B,IAAM4pB,GAAS5pB,GACpB2B,KAAKgqB,QAAU/B,GAAS+B,GACxBhqB,KAAK0pB,OAAS,IAAIf,GAAItqB,GACtB2B,KAAKgkB,UAAYA,EAAY,EACD,IAAxBhkB,KAAKgqB,QAAQtpB,OACb,MAAM,IAAIyC,MAAM,gDAMxBqmB,EAAQ9qB,UAAUsqB,QAAU,SAAUK,EAASnB,GAI3C,IAHA,IAAIxd,EAAOud,GAASoB,GAChBM,EAAazB,GAAO,IAAIhb,YAAYxC,EAAKhK,QACzCuR,EAASjS,KAAKiS,OACTlV,EAAI,EAAGA,EAAI2N,EAAKhK,OAAQ3D,GAAKiD,KAAKgkB,UAAW,CAElD,IADA,IAAInjB,EAAIb,KAAK0pB,OAAOV,QAAQhpB,KAAKgqB,SACxB3nB,EAAItF,EAAGwQ,EAAI0E,EAAQ5P,EAAIqI,EAAKhK,QAAU6M,EAAIvN,KAAKgkB,UAAW3hB,IAAKkL,IACpEoc,EAAWtnB,GAAKxB,EAAE0M,GAAK7C,EAAKrI,GAC5BqI,EAAKhK,OAAS3D,GAAKiD,KAAKgkB,WACxBhkB,KAAKiqB,mBACLhY,IACAlV,GAAKkV,EACLA,EAAS,GAIjB,OADAjS,KAAKiS,QAAUjS,KAAKiS,OAAUvH,EAAKhK,OAAS,GAAM,EAC3CipB,GAKXH,EAAQ9qB,UAAU6qB,QAAU,SAAUF,EAASnB,GAC3C,OAAOloB,KAAKgpB,QAAQK,EAASnB,IAEjCsB,EAAQ9qB,UAAUurB,iBAAmB,WAEjC,IAAK,IAAI1oB,EAAQvB,KAAKgqB,QAAQtpB,OAAS,EAAGa,GAAS,OACzCvB,KAAKgqB,QAAQzoB,GAAS,YADsBA,OAzChC,GAiDS,IAIvC,SAAS2oB,GAAgBnc,GACrB,MAAMxQ,EAAI,IAAI0R,WAAWlB,EAAM6J,YAC/B,IAAK,IAAI7a,EAAI,EAAG2D,EAAwB,EAAfqN,EAAMrN,OAAY3D,EAAI2D,IAAU3D,EACrDQ,EAAER,GAAOgR,EAAMhR,IAAM,KAAQ,GAAMA,EAAI,EAAK,EAAM,IAEtD,OAAOQ,EAKX,SAAS4sB,GAAcpc,GACnB,MAAMiP,EAAQyH,EAAoB1W,GAC5Bqc,EAAQ,GACd,IAAK,IAAIrtB,EAAI,EAAG6iB,EAAM5C,EAAMtc,OAAQ3D,EAAI6iB,IAAO7iB,EAC3CqtB,EAAMrtB,IAAM,IAAMigB,EAAMjgB,IAAO,GAAMA,EAAI,EAAK,EAElD,OAAO,IAAImQ,YAAYkd,GAQ3B,SAASC,GAAQrN,EAAOsN,EAAUC,EAASvB,GAAU,GAKjD,OAAOkB,GAHQ,IAAIV,GAAQW,GAAcG,GAAWH,GAAcI,IACpCvB,EAAU,UAAY,WAAWmB,GAAcnN,KAIjF,SAASwN,GAAexN,EAAOsN,EAAUC,GACrC,OAAOF,GAAQtG,EAAW/G,GAAQsN,EAAUC,GAAS,GAEzD,SAASE,GAAezN,EAAOsN,EAAUC,GACrC,OAAOF,GAAQrN,EAAOsN,EAAUC,GAAS,GAKhB,IAAIG,GADE,oBAAb,QAA4B,WAAYlc,OAASA,OAAOqV,OAAO8G,OAASznB,KAAK2gB,OAAO8G,OAItGC,GAAuD,SAAU/F,EAASC,EAAYvR,EAAGwR,GAEzF,OAAO,IAAKxR,IAAMA,EAAI0E,WAAU,SAAUI,EAASG,GAC/C,SAASwM,EAAUjnB,GAAS,IAAMknB,EAAKF,EAAU7f,KAAKnH,IAAW,MAAO0M,GAAK+N,EAAO/N,IACpF,SAASya,EAASnnB,GAAS,IAAMknB,EAAKF,EAAiB,MAAEhnB,IAAW,MAAO0M,GAAK+N,EAAO/N,IACvF,SAASwa,EAAKxhB,GAJlB,IAAe1F,EAIa0F,EAAOmQ,KAAOyE,EAAQ5U,EAAO1F,QAJ1CA,EAIyD0F,EAAO1F,MAJhDA,aAAiBwV,EAAIxV,EAAQ,IAAIwV,GAAE,SAAU8E,GAAWA,EAAQta,OAITua,KAAK0M,EAAWE,GAClGD,GAAMF,EAAYA,EAAU5Z,MAAM0Z,EAASC,GAAc,KAAK5f,YAItE,SAAS2lB,GAAO1M,EAAQ2M,EAAMxiB,GAC1B,OAAOsiB,GAAe5qB,UAAM,OAAQ,GAAQ,YACxC,MAAM+qB,QAAkBL,GAAcK,UAAU,MAAO5M,EAAQ,CAAE9gB,KAAM,WAAY,EAAO,CAAqB,eAsB/G,OANaqtB,GAAcM,WAAW,CAClC3tB,KAAM,SACNytB,OACAxiB,aACAwd,KAAM,CAAEzoB,KAAM,YACf0tB,EAAW,KACFzS,KAAK6F,GAAU,IAAIlP,WAAWkP,OAKlD,SAAS8M,GAAaC,GAClB,MAAMtL,EAAMsL,EAAUxqB,OAChBsc,EAAQ,IAAI/N,WAAW5O,KAAKW,KAAK4e,EAAM,IAC7C,IAAI7U,EAAQ,EACR6U,EAAM,IACN5C,EAAMjS,KAAWwB,SAAS2e,EAAUhK,OAAO,GAAI,KAEnD,IAAK,IAAInkB,EAAIgO,EAAOhO,EAAI6iB,EAAK7iB,GAAK,EAC9BigB,EAAMjS,KAAWwB,SAAS2e,EAAUrK,OAAO9jB,EAAG,GAAI,IAEtD,OAAOigB,EAMX,SAASmO,GAAWnO,EAAOoO,GACvB,OAAO5H,EAAYxG,EAAOiO,GAAaG,EAAUC,UAAWJ,GAAaG,EAAUE,UAOvF,SAASC,GAAKvO,GACV,OAAO0N,GAAcc,OAAO,QAAS/G,EAAoBzH,IAAQ1E,KAAKnX,GAC3D,IAAI8N,WAAW9N,IAqB9B,SAASsqB,GAAOzO,GACZ,OAAO0N,GAAcc,OAAO,UAAW/G,EAAoBzH,IAAQ1E,KAAKnX,GAE7D,IAAI8N,WAAW9N,IAuB9B,MAAMuqB,GAAS,CACXC,EAAG,IAAI1c,WAAW,GAClB2c,GAAI,IAAI5c,YAAY,GACpB6c,GAAI,IAAI3e,YAAY,IAExB,SAAS4e,GAAe9jB,GACpB,MAAM+jB,EAAQL,GAAO1jB,GAErB,OADA6b,OAAOC,gBAAgBiI,GAChBA,EAAM,GAEjB,SAASC,KACL,MAAO,GAAKF,GAAe,IAAMA,GAAe,IAAM,SAM1D,SAASG,GAAa5hB,EAAKxE,GACvB,OAAOwX,EAAmBnc,EAAEsH,YAAY6B,EAAKxE,EAAK,IACvCimB,GAAe,IAAM,YAoBpC,SAASI,GAAmB3tB,GACxB,MAAM4tB,EAAM9O,EAAmBnc,EAAE,GACjC,GAAI3C,EAAEuE,UAAUqpB,GAAKtlB,SACjB,OAAOslB,EAEX,MAAMjvB,EAAImgB,IAAqB,KAC/B,IAAInc,EAAGL,EAAG+E,EAAGwmB,EAAIxuB,EAAGiF,EAAG4K,EACvB,GACIvM,EAAI+qB,GAAa5O,EAAmBnc,EAAE2H,IAAKtK,EAAE+G,MAAM,UAChDpE,EAAE2F,UAAY3F,EAAEkG,GAAG7I,EAAE+G,MAAM6mB,KAClCvmB,EAAIqmB,GAAa5O,EAAmBnc,EAAE2H,IAAKtK,EAAE+G,MAAM,IACnD1H,EAAIyf,EAAmBnc,EAAE2H,IACzBhG,EAAIwa,EAAmBnc,EAAE2H,IAKzB,MACMwjB,EADehP,IAAqB,mBAAoB,IACd/X,MAAM/G,GAAG6G,KAAK,GACxDknB,EAAY1mB,KAEdA,GADAA,EAAIA,EAAEU,IAAI6lB,GAAK7nB,IAAI/F,IACb0C,IAAIC,IACJ2D,OAAO3D,KACT0E,EAAIA,EAAE3E,IAAIorB,IAEdzmB,EAAIA,EAAEtB,IAAI/F,IAGd,EAAG,CACCsC,EAAI+E,EACJ,IAAK,IAAI7I,EAAI,EAAGsgB,IAAqBtgB,GAAG8H,OAAOjH,KAAMb,EACjD6I,EAAI0mB,EAAS1mB,GAEjB,IAAI2H,EAAI8P,EAAmBnc,EAAEyH,KAC7B,EAAG,CACCyjB,EAAKxmB,EACL,MAAM2mB,EAAYlP,EAAmBnc,EAAEmJ,IAAInN,EAAGU,EAAE0H,MAAMiI,IACtD,IAAK,IAAIxQ,EAAI,EAAGsgB,IAAqBtgB,GAAG8H,OAAO0nB,KAAcxvB,EACzD6I,EAAI0mB,EAAS1mB,GACb/C,EAAIA,EAAE2C,SAAS3E,EAAE0G,QAAQ3B,GAAK/E,EAAEyE,MAAMM,GAAKA,EAAEN,MAAMzE,IAAIyD,IAAI/F,GAE/DkP,EAAI4P,EAAmBnc,EAAEoJ,IAAIzH,EAAGtE,GAChCgP,EAAIA,EAAEtM,IAAI/D,SACLqQ,EAAE1I,OAAOjH,IAAM6P,EAAErG,GAAGiW,EAAmBnc,EAAE2H,MAClDjL,EAAIA,EAAE2E,UAAU8a,EAAmBnc,EAAE2H,WAChC4E,EAAErG,GAAGiW,EAAmBnc,EAAE2H,MACnC,GAAI4E,EAAErG,GAAG7I,GACL,GACI6tB,EAAKE,EAASF,GACd3e,EAAI4P,EAAmBnc,EAAEoJ,IAAIzJ,EAAEyE,MAAM8mB,GAAI/oB,MAAO9E,SAC3CkP,EAAErG,GAAGiW,EAAmBnc,EAAE2H,MAEvC,OAAO4E,EAoCX,SAAS+e,GAAwBC,GAC7B,IAAIC,EAnCR,SAAsBD,GAClB,MAAMluB,EAAI+kB,EAAgBmJ,GACpBC,EAAU,GACVC,EAAS,GACf,IAAIC,EAASV,GAAmB3tB,GAChCmuB,EAAQjrB,KAAKlD,EAAE0G,OAAO2nB,IACtBF,EAAQjrB,KAAKmrB,GAEb,EAAG,CACC,MAAM1vB,EAAIwvB,EAAQG,MAClB,IAAI3vB,EAAEkK,GAAGiW,EAAmBnc,EAAE2H,KAE9B,GAAI3L,EAAE4K,SAAQ,GAAO,CACjB6kB,EAAOlrB,KAAKvE,GAEZ,IAAK,IAAIH,EAAI,EAAGA,EAAI2vB,EAAQhsB,SAAU3D,EAAG,CACrC,IAAIwQ,EAAImf,EAAQ3vB,GAChB,GAAIwQ,EAAEjJ,IAAIpH,GAAG2J,SAAU,CACnB,GACI0G,EAAIA,EAAEtI,OAAO/H,SACVqQ,EAAEjJ,IAAIpH,GAAG2J,UAChB6lB,EAAQ3vB,GAAKwQ,SAMrBqf,EAASV,GAAmBhvB,GAC5BwvB,EAAQjrB,KAAKvE,EAAE+H,OAAO2nB,IACtBF,EAAQjrB,KAAKmrB,SAEZF,EAAQhsB,QACjB,OAAOisB,EAGOG,CAAaL,GAC3BC,EAAQK,KAAK,CAAC7rB,EAAGC,IAAMD,EAAE+F,QAAQ9F,IAC7BurB,EAAQhsB,OAAS,IACjBgsB,EAAU,CACNA,EAAQM,OAAON,EAAQhsB,OAAS,EAAG,GAAG,GACtCgsB,EAAQhV,OAAO,CAACC,EAAKnY,IAAMmY,EAAInS,SAAShG,GAAI6d,EAAmBnc,EAAE2H,OAGzE,MAAMjK,EAAI8tB,EAAQ,GAAI7pB,EAAI6pB,EAAQA,EAAQhsB,OAAS,GACnD,OAAQ9B,EAAEiG,OAAOhC,GAAK,CAACjE,EAAGiE,GAAK,CAACA,EAAGjE,IAAIwM,IAAIjK,GAAKoiB,EAAcpiB,IASlE,IAAI8rB,GAA2D,SAAUpI,EAASC,EAAYvR,EAAGwR,GAE7F,OAAO,IAAKxR,IAAMA,EAAI0E,WAAU,SAAUI,EAASG,GAC/C,SAASwM,EAAUjnB,GAAS,IAAMknB,EAAKF,EAAU7f,KAAKnH,IAAW,MAAO0M,GAAK+N,EAAO/N,IACpF,SAASya,EAASnnB,GAAS,IAAMknB,EAAKF,EAAiB,MAAEhnB,IAAW,MAAO0M,GAAK+N,EAAO/N,IACvF,SAASwa,EAAKxhB,GAJlB,IAAe1F,EAIa0F,EAAOmQ,KAAOyE,EAAQ5U,EAAO1F,QAJ1CA,EAIyD0F,EAAO1F,MAJhDA,aAAiBwV,EAAIxV,EAAQ,IAAIwV,GAAE,SAAU8E,GAAWA,EAAQta,OAITua,KAAK0M,EAAWE,GAClGD,GAAMF,EAAYA,EAAU5Z,MAAM0Z,EAASC,GAAc,KAAK5f,YAStE,SAASgoB,GAAWC,GAChB,OAAOF,GAAmBjtB,UAAM,OAAQ,GAAQ,YAC5C,MAAMpB,EAAEA,EAAC6O,EAAEA,GAAM0f,EAgBXjsB,EAfY,CAACtC,IACf,OAAS,CACL,MAAMsC,EAAI0iB,EAAU,IAAI3U,WAAWrQ,EAAE8B,SAE/B0sB,EAAU9J,EAAgBpiB,GAChC,IAAKksB,EAAQ7lB,QAAQ8V,EAAmBnc,EAAE2H,KACtC,SAEJ,MAAMwkB,EAAU/J,EAAgB1kB,GAChC,GAAKwuB,EAAQvoB,OAAOwoB,EAAQzrB,SAASyb,EAAmBnc,EAAE2H,MAG1D,OAAO3H,IAGLosB,CAAU1uB,GAEd2uB,EAAStC,GAAaxd,EAAElH,SAAS,KACjCinB,EAAMzJ,QAAiB6B,GAAaC,aAAa,UAAW0H,EAAQrsB,EAAGtC,GAAI,KAAK,GAAM,GAAM,GAQlG,MANW,CACPsC,EAAGA,EACHssB,IAAKA,EACLC,eAJmB7H,GAAaC,aAAa,SAAU2H,GAKvD5uB,QAYZ,IAAI8uB,GAA6D,SAAU7I,EAASC,EAAYvR,EAAGwR,GAE/F,OAAO,IAAKxR,IAAMA,EAAI0E,WAAU,SAAUI,EAASG,GAC/C,SAASwM,EAAUjnB,GAAS,IAAMknB,EAAKF,EAAU7f,KAAKnH,IAAW,MAAO0M,GAAK+N,EAAO/N,IACpF,SAASya,EAASnnB,GAAS,IAAMknB,EAAKF,EAAiB,MAAEhnB,IAAW,MAAO0M,GAAK+N,EAAO/N,IACvF,SAASwa,EAAKxhB,GAJlB,IAAe1F,EAIa0F,EAAOmQ,KAAOyE,EAAQ5U,EAAO1F,QAJ1CA,EAIyD0F,EAAO1F,MAJhDA,aAAiBwV,EAAIxV,EAAQ,IAAIwV,GAAE,SAAU8E,GAAWA,EAAQta,OAITua,KAAK0M,EAAWE,GAClGD,GAAMF,EAAYA,EAAU5Z,MAAM0Z,EAASC,GAAc,KAAK5f,YAKtE,SAASyoB,GAAa3G,EAAK9lB,EAAGtC,GAC1B,OAAO8uB,GAAqB1tB,UAAM,OAAQ,GAAQ,YAC9C,MAAM3B,QAAYunB,GAAaC,aAAa,UAAWmB,EAAK9lB,EAAGtC,GAI/D,MAAO,CAAEP,MAAKuvB,gBADetK,SAFDsC,GAAaC,aAAa,OAAQxnB,IACxByH,OAAO,GAAG3B,WACcoC,SAAS,QAW/E,IAAIsnB,GAAqE,SAAUhJ,EAASC,EAAYvR,EAAGwR,GAEvG,OAAO,IAAKxR,IAAMA,EAAI0E,WAAU,SAAUI,EAASG,GAC/C,SAASwM,EAAUjnB,GAAS,IAAMknB,EAAKF,EAAU7f,KAAKnH,IAAW,MAAO0M,GAAK+N,EAAO/N,IACpF,SAASya,EAASnnB,GAAS,IAAMknB,EAAKF,EAAiB,MAAEhnB,IAAW,MAAO0M,GAAK+N,EAAO/N,IACvF,SAASwa,EAAKxhB,GAJlB,IAAe1F,EAIa0F,EAAOmQ,KAAOyE,EAAQ5U,EAAO1F,QAJ1CA,EAIyD0F,EAAO1F,MAJhDA,aAAiBwV,EAAIxV,EAAQ,IAAIwV,GAAE,SAAU8E,GAAWA,EAAQta,OAITua,KAAK0M,EAAWE,GAClGD,GAAMF,EAAYA,EAAU5Z,MAAM0Z,EAASC,GAAc,KAAK5f,YAKtE,SAAS4oB,GAAsB9Q,GAC3B,MAAMtc,EAASsc,EAAMtc,OACfsH,EAAgB,EAATtH,EACb,IAAI3C,EAAQsf,IAAqBL,EAAM,IAAI/S,IAAI,KAAM1H,UAAUyF,EAAO,GACtE,IAAK,IAAIjL,EAAI,EAAGA,EAAI2D,IAAU3D,EAAG,CAC7B,MAAMgxB,EAAQ/lB,EAAiB,GAATjL,EAAI,GACpBoE,EAAIkc,IAAqBL,EAAMjgB,IACrCgB,EAAQA,EAAMmM,GAAG6jB,EAAQ5sB,EAAEoB,UAAUwrB,GAAS5sB,GAElD,OAAOpD,EAGX,MAAMiwB,GAAS,CACX,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,OAAQ,QA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","file":"mtproto.worker.a82172768f4f413f9db0.bundle.worker.js","sourceRoot":""} \ No newline at end of file diff --git a/public/mtproto.worker.ce5cd25d42b20b126773.bundle.worker.js b/public/mtproto.worker.ce5cd25d42b20b126773.bundle.worker.js new file mode 100644 index 00000000..d64e948d --- /dev/null +++ b/public/mtproto.worker.ce5cd25d42b20b126773.bundle.worker.js @@ -0,0 +1,4 @@ +!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=y(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+y]!==h&&(n=Math.floor((_[s+y]*l+_[s+y-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(),[c(m),c(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=c(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)),y=f(f(o,S(v(v(d,o),m),n)),S(m,2*n));return l(y),y}(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),y(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(y(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,y=null,c=[];!r.isZero()||!p.isZero();)o=(d=A(r,V))[1].toJSNumber(),n&&(o=V-1-o),m=(y=A(p,V))[1].toJSNumber(),i&&(m=V-1-m),r=d[0],p=y[0],c.push(a(o,m));for(var l=0!==a(n?1:0,i?1:0)?s(-1):s(0),g=c.length-1;g>=0;g-=1)l=l.multiply(V).add(s(c[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],y=r.indexOf(".");if(y>=0&&(s-=r.length-y-1,r=r.slice(0,y)+r.slice(y+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 c=[],g=e.length,h=g-7;g>0;)c.push(+e.slice(h,g)),(h-=7)<0&&(h=0),g-=7;return l(c),new p(c,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,y=0;y{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,y,c,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,y=C.window,c=C.hold,l=C.bits,g=C.lencode,u=C.distcode,h=(1<>>24,c>>>=v,l-=v,v=_>>>16&255,0===v)k[s++]=65535&_;else{if(!(16&v)){if(0==(64&v)){_=g[(65535&_)+(c&(1<>>=v,l-=v),l<15&&(c+=I[a++]<>>24,c>>>=v,l-=v,v=_>>>16&255,!(16&v)){if(0==(64&v)){_=u[(65535&_)+(c&(1<p){e.msg="invalid distance too far back",C.mode=30;break e}if(c>>>=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=y,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,c&=(1<{const c=y.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,y.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),y.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:y,Z_BLOCK:c,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,y=d||m,c=(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?c.bind(null,!1):d?l:g,h=m?c.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),y||(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(y){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(y(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=c.greater(h)?c:c.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,y=4,c=0;c>>24]^Z[p>>16&255]^Q[o>>8&255]^$[255&m]^this.encKey[y],a=J[p>>>24]^Z[o>>16&255]^Q[m>>8&255]^$[255&r]^this.encKey[y+1],n=J[o>>>24]^Z[m>>16&255]^Q[r>>8&255]^$[255&p]^this.encKey[y+2],m=J[m>>>24]^Z[r>>16&255]^Q[p>>8&255]^$[255&o]^this.encKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[c]=z[r>>>24]<<24^z[p>>16&255]<<16^z[o>>8&255]<<8^z[255&m]^this.encKey[y++],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,y=4,c=0;c>>24]^Y[p>>16&255]^ee[o>>8&255]^te[255&m]^this.decKey[y],a=X[p>>>24]^Y[o>>16&255]^ee[m>>8&255]^te[255&r]^this.decKey[y+1],n=X[o>>>24]^Y[m>>16&255]^ee[r>>8&255]^te[255&p]^this.decKey[y+2],m=X[m>>>24]^Y[r>>16&255]^ee[p>>8&255]^te[255&o]^this.decKey[y+3],r=t,p=a,o=n,y+=4;for(c=0;c<4;c++)i[3&-c]=H[r>>>24]<<24^H[p>>16&255]<<16^H[o>>8&255]<<8^H[255&m]^this.decKey[y++],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 ye(e,t,a){return me(e,t,a,!1)}var ce="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 ce.importKey("raw",e,{name:"PBKDF2"},!1,["deriveBits"]);return ce.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 ce.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),y=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=y(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=y(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=y(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.2",versionFull:"1.4.2 (161)",build:161,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,yt=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},ct=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),yt(this,pt,new lt(t),"f"),yt(this,dt,new re(e),"f"),yt(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 y=p-m;if(y<12||y>1024)throw new Error("[MT] Invalid padding length: "+y);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 y=d.getBytes(!0);let c;o&&this.log("Send req_DH_params",m);try{c=yield this.sendPlainRequest(e.dcId,y)}catch(e){throw this.log.error("Send req_DH_params FAIL!",e),e}const l=c.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 y=yield Ve.invokeCrypto("sha1",d),c=y.slice(0,8),l=y.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],c))).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],c))).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],c))).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=c.map(e=>e.result);r(y?t:t[0])};const m=setTimeout(()=>{this.log.error("transaction not finished",o)},1e4),d=t(o.objectStore(n)),y=Array.isArray(d),c=y?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 y,c;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);y=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)}),y=Ft.getNetworker(e,a.authKey,a.authKeyId,a.serverSalt,t)}catch(e){c=e}const l=this.getTransportType(a);if(l!==n&&(p=this.generateNetworkerGetKey(e,l,a),d.destroy(),St.removeTransport(kt.chosenServers,d),y&&(d=this.chooseServer(e,a,l)),this.log("transport has been changed during authorization from",n,"to",l)),delete this.gettingNetworkers[p],c)throw this.log("get networker error",c,c.stack),c;return this.changeNetworkerTransport(y,d),i.unshift(y),this.setOnDrainIfNeeded(y),y})))}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 y;return y=(r=a.dcId||this.baseDcId)?this.getNetworker(r,a):this.getBaseDcId().then(e=>this.getNetworker(r=e,a)),y.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)=>Ve.invokeCrypto("gzipUncompress",e.slice().buffer,!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 y,c,l=!1,g=e=>{y=e,delete this.cachedDownloadPromises[r],m.reject(y),g=()=>{},!c||y&&"DOWNLOAD_CANCELED"===y.type||c.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;c=p;let d,y=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:y,writeFileDeferred:d}),y=d,o+=t}while(oXt(this,void 0,void 0,(function*(){const{offset:o,writeFilePromise:d,writeFileDeferred:y}=v.shift();try{f();const c=yield _(n,s,o,t,u,e.queueId,f),g=c.bytes;v.length&&w(),this.debug&&this.log("downloadFile requestFilePart result:",r,c);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(y.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(y)throw y};return m.cancel=()=>{if(!y&&!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),y=we();let c=0;const l={_:s?"inputFileBig":"inputFile",id:y,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:y,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.ce5cd25d42b20b126773.bundle.worker.js.map \ No newline at end of file diff --git a/public/mtproto.worker.ce5cd25d42b20b126773.bundle.worker.js.map b/public/mtproto.worker.ce5cd25d42b20b126773.bundle.worker.js.map new file mode 100644 index 00000000..bd6529c2 --- /dev/null +++ b/public/mtproto.worker.ce5cd25d42b20b126773.bundle.worker.js.map @@ -0,0 +1 @@ +{"version":3,"sources":["webpack:///mtproto.worker.1b1ad5df3a372f862541.bundle.worker.js"],"names":["modules","installedModules","__webpack_require__","moduleId","exports","module","i","l","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","__WEBPACK_AMD_DEFINE_RESULT__","bigInt","undefined","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","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","-1","-2","-3","-4","-5","-6","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","__webpack_exports__","bufferConcats","args","reduce","acc","byteLength","lastLength","forEach","ArrayBuffer","isWebpSupported","Promise","finally","onFinally","callback","resolve","then","reason","reject","Modes","location","search","debug","http","ssl","multipleConnections","asServiceWorker","transport","modes","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","localStorage_LocalStorage","[object Object]","prefix","cache","useStorage","useCache","localStorage","getItem","JSON","parse","obj","onlyLocal","stringified","setItem","saveLocal","removeItem","keys","delete","enabled","clear","localStorage_LocalStorageController","taskId","tasks","STORAGES","storage","id","payload","proxy","sessionStorage","appStorage","lib_sessionStorage","mtproto_schema","MTProto","constructors","predicate","params","methods","method","API","layer","bytesToHex","bytes","isObject","pako_inflate_min","pako_inflate_min_default","gzipUncompress","BigInteger_default","intToUint","longFromInts","high","boolFalse","find","boolTrue","vector","gzipPacked","tl_utils_TLSerialization","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","methodData","storeInt","pFlags","flagsOffsets","param","condType","fieldBit","storeObject","paramName","storeLong","storeString","storeBytes","storeDouble","storeBool","substr","itemType","schema","isBare","constructorData","charAt","tl_utils_TLDeserialization","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","__awaiter","thisArg","_arguments","generator","fulfilled","step","rejected","computeSRP","password","isNew","algo","new_algo","current_algo","pw_hash","client_salt","server_salt","cryptoworker","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","aes_S","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","aes","counter","incrementCounter","bytesFromWordss","bytesToWordss","words","aesSync","keyBytes","ivBytes","aesEncryptSync","aesDecryptSync","crypto_subtle","subtle","pbkdf2_awaiter","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_awaiter","generateDh","dhConfig","aBigInt","pBigInt","generateA","gBytes","g_a","g_a_hash","computeDhKey_awaiter","computeDhKey","key_fingerprint","getEmojisFingerprint_awaiter","readBigIntFromBytesBE","_bits","emojis","getEmojisFingerprint","emojisLength","partOffset","codePoints","performTaskWorker","super","webWorker","awaiting","pending","utils","aes-encrypt","aes-decrypt","rsa-encrypt","factorize","mod-pow","generate-dh","compute-dh-key","get-emojis-fingerprint","task","timeManager","lastMessageId","timeOffset","timeTicks","Date","now","messageId","serverTime","localTime","newTimeOffset","changed","server_time_offset","mtproto_timeManager","environment_ctx","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","app","noop_noop","pause","ms","setTimeout","deferredPromise","deferredHelper","isFulfilled","isRejected","notify","lastNotify","addNotifyListener","deferred","catch","cancel","assign","findAndSplice","verify","findIndex","eventListenerBase_EventListenerBase","reuseResults","_constructor","listenerResults","_a","_b","once","addEventListener","collectResults","removeEventListener","_dispatchEvent","indexOfAndSplice","item","idx","spliced","websocket_Socket","dcId","url","logSuffix","handleOpen","dispatchEvent","handleError","close","handleClose","removeListeners","handleMessage","event","data","send","body","ws","logTypes","connect","WebSocket","binaryType","_CTR_counter","_CTR_remainingCounter","_CTR_remainingCounterIndex","_CTR_aes","__classPrivateFieldSet","receiver","kind","has","__classPrivateFieldGet","Counter","initialValue","obfuscation_CTR","encrypted","increment","WeakMap","obfuscation_Obfuscation","codec","initPayload","val2","reversedPayload","encIv","decIv","encNew","decNew","obfuscateTag","update","ConnectionStatus","intermediate","tag","tcpObfuscated_TcpObfuscated","Connection","retryTimeout","obfuscation","connected","autoReconnect","onOpen","controller","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","socketProxied_SocketProxied","socketsProxied","Map","TEST_SUFFIX","dcConfigurator_DcConfigurator","sslSubdomains","dcOptions","host","port","chosenServers","transportSocket","connectionType","path","chosenServer","transportHTTP","dcOption","http_HTTP","transportType","reuse","client","download","upload","servers","transports","dcConfigurator","mtproto_dcConfigurator","controller_awaiter","opened","waitForWebSocket","https","chooseServer","websocket","httpPromise","_send","websocketPromise","socket","isHttpAvailable","isWebSocketAvailable","destroy","pinging","pingTransports","setTransportValue","http_awaiter","fetch","status","arrayBuffer","TextDecoder","setConnected","destroyed","releasing","bytesCmp","networker_awaiter","networker_delays","disconnectDelayMin","disconnectDelayMax","pingInterval","pingMaxTime","connectionTimeout","file","RESEND_OPTIONS","noSchedule","notContentRelated","invokeAfterMsgConstructor","networker_MTPNetworker","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","initConnection","mtproto_networkerFactory","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","rsaKeysManager_awaiter","rsaKeysManager","testPublicKeysHex","publisKeysHex","publicKeysParsed","prepared","preparePromise","keyParsed","RSAPublicKey","fingerprintBytes","fingerprints","prepare","fingerprintHex","fill","foundKey","fingerprint","authorizer_awaiter","authorizer","cached","requestArray","requestLength","headerArray","errorCode","auth_key_id","msg_len","auth","nonce","sendPlainRequest","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","idb_IDBStorage","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_awaiter","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","_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","mtproto_apiManager","fileManager_awaiter","fileManager","blobSupported","size","saveFileCallback","write","finalize","saveToStorage","getParts","replaceParts","parts","cacheStorage_awaiter","cacheStorage_CacheStorageController","dbName","caches","timeoutOperation","Response","headers","Content-Length","res","fileSize","fakeWriter","getFakeFileWriter","saveFile","deleteAll","readBlobAsArrayBuffer","reader","FileReader","readBlobAs","apiFileManager_awaiter","apiFileManager","cacheStorage","cachedDownloadPromises","uploadPromises","downloadPulls","downloadActives","webpConvertPromises","refreshReferencePromises","tempId","queueId","uncompressTGS","uncompressTGV","convertWebp","convertPromise","hex","activeDelta","downloadPull","downloadCheck","downloadLimit","from","canceled","limit","checkCancel","downloadRequest","getDelta","invoke","refreshReference","reference","file_reference","checkedReference","inputFileLocation","isAvailable","process","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","Set","mtproto_apiFileManager","mtproto_worker_awaiter","webpSupported","setUpdatesProcessor","taskListeners","webpSupport","socketProxy","socketTask","socketProxied","localStorageProxy","finishTask","online","toggleStorage","originalPayload"],"mappings":"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","file":"mtproto.worker.ce5cd25d42b20b126773.bundle.worker.js","sourceRoot":""} \ No newline at end of file diff --git a/public/report.html b/public/report.html index 3d141406..64c13533 100644 --- a/public/report.html +++ b/public/report.html @@ -3,7 +3,7 @@ - tweb [15 Apr 2022 at 15:58] + tweb [16 Apr 2022 at 20:15] diff --git a/public/sw.js b/public/sw.js index c9f161fd..80cce2d3 100644 --- a/public/sw.js +++ b/public/sw.js @@ -1,4 +1,4 @@ -var serviceWorkerOption = {"assets":["/0.50ca39d9514acbfe6a6a.chunk.js","/1.1fbe64f8013ab3be0499.chunk.js","/11.485cff055ef366a5dc5a.chunk.js","/12.98f15505a7862a1f5623.chunk.js","/13.5f88e9579f7a932dfad4.chunk.js","/14.d15027c531ca1671a9e3.chunk.js","/15.59dc38a60e45ddb6327a.chunk.js","/16.1163d3ba587800ecae20.chunk.js","/17.f7254c2398a46332f31d.chunk.js","/18.045ea4aeee8c09bb86f6.chunk.js","/19.963fd24da8d461207246.chunk.js","/2.67fe5109f1ffeaa937f9.chunk.js","/20.56a736e3dc441023f4f8.chunk.js","/21.f29643148b4ebe90e4ca.chunk.js","/22.c0ac3c204b1397aea626.chunk.js","/23.81a67a70b9b28e4f121f.chunk.js","/24.42ebbd3ee500042019ef.chunk.js","/3.f43eeadba6063db40ad3.chunk.js","/4.91c33794543af8f50348.chunk.js","/5.8ea7ea01378265598d5f.chunk.js","/6.7ffd20da266d386fcaec.chunk.js","/7.e438432370239fd6ae1d.chunk.js","/8.02a6c8937bbd384c2467.chunk.js","/main.4a428d15159ecb0287a0.css","/main.5be7f9ad8fda8c3f79cf.bundle.js","/mtproto.worker.a82172768f4f413f9db0.bundle.worker.js","/npm.qr-code-styling.80cef69985dcb7541efc.chunk.js","/rlottie.worker.086dfed03cbca80766c6.bundle.worker.js","/style-desktop.9d7b485ed526720a3aad.css","/webp.worker.c0cc94110cda650246b2.bundle.worker.js"]}; +var serviceWorkerOption = {"assets":["/0.50ca39d9514acbfe6a6a.chunk.js","/1.f63fd3ceb28384c193a9.chunk.js","/11.9d6292221b761a8e5ba9.chunk.js","/12.49af8796ae03f597ea67.chunk.js","/13.a1a0e4713c63e85c7faf.chunk.js","/14.0c3a1ae74a0c65edf059.chunk.js","/15.59dc38a60e45ddb6327a.chunk.js","/16.049af2cb2d7656888f47.chunk.js","/17.d520b3312c59a122ae5d.chunk.js","/18.db688e1ac83bd1339811.chunk.js","/19.963fd24da8d461207246.chunk.js","/2.9ab0343c05ba5c67500b.chunk.js","/20.56a736e3dc441023f4f8.chunk.js","/21.f29643148b4ebe90e4ca.chunk.js","/22.c0ac3c204b1397aea626.chunk.js","/23.81a67a70b9b28e4f121f.chunk.js","/24.42ebbd3ee500042019ef.chunk.js","/3.f43eeadba6063db40ad3.chunk.js","/4.3e09949378470770bf73.chunk.js","/5.73d599f377c00cd66014.chunk.js","/6.fcc4f6420b303e25e8ce.chunk.js","/7.0df5f895e8235966714f.chunk.js","/8.02a6c8937bbd384c2467.chunk.js","/main.246a2689821bf26a9583.css","/main.df631e4b57ec50c6de09.bundle.js","/mtproto.worker.ce5cd25d42b20b126773.bundle.worker.js","/npm.qr-code-styling.80cef69985dcb7541efc.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/version b/public/version index 302c9dc6..74d65c8f 100644 --- a/public/version +++ b/public/version @@ -1 +1 @@ -1.4.1 (160) \ No newline at end of file +1.4.2 (161) \ No newline at end of file diff --git a/src/lib/appManagers/apiUpdatesManager.ts b/src/lib/appManagers/apiUpdatesManager.ts index 8736d80d..c4340023 100644 --- a/src/lib/appManagers/apiUpdatesManager.ts +++ b/src/lib/appManagers/apiUpdatesManager.ts @@ -689,11 +689,17 @@ export class ApiUpdatesManager { if(newVersion) { this.updatesState.syncLoading.then(async() => { + const strs: Record = { + en: 'was updated to version', + ru: 'обновлён до версии' + }; + const getChangelog = (lang: string) => { - fetch(`changelogs/${newVersion.split(' ')[0]}_${lang}.md`) + fetch(`changelogs/${lang}_${newVersion.split(' ')[0]}.md`) .then(res => (res.status === 200 && res.ok && res.text()) || Promise.reject()) .then(text => { - const pre = `**Telegram Web${App.suffix} was updated to version ${newVersion}**\n\n`; + const langStr = strs[lang] || strs.en; + const pre = `**Telegram Web${App.suffix} ${langStr} ${newVersion}**\n\n`; text = pre + text;